Аргументи командного рядка

 

Функція main () є головною функцією, визначеною користувачем, якій буде передано керування.

Функція main визначається наступним чином:

 

main (int argс, char * argv [], char * envp [])

1 2 3

1 - кількість аргументів командного рядка

2 - список аргументів командного рядка

3 - список змінних оточення

 

При запуску будь-яка програма UNIX отримує від зухвалої процесу два набори даних: аргументи командного рядка і змінні середовища оточення. У програмах на мові С обидва набори представлені у вигляді масивів покажчиків, причому останній покажчик у кожному з масивів має значення NULL. Крім того, програма отримує лічильник, що містить кількість елементів у масиві аргументів.

 

Аргументи командного рядка це додаткові інформаційні елементи, що передаються програмі під час запуску. Вони задаються в командному рядку і відділяються від імені програми і один від одного пробілами. (Аргумент, що містить пробіл, повинен екрануватися.)

 

Ім'я самої програми теж входить до списку аргументів. Наприклад, викликається програма ls, що відображає вміст кореневого каталогу та розміри відповідних файлів:

%ls –s /

 

У даному випадку список аргументів програми ls складається з трьох елементів. Перший - це ім'я самої програми, вказане в командному рядку, а саме ls. Другий і третій елементи - аргументи командного рядка-s і /.

 

Масив argv [] має довжину argс

Елемент argv [0] дорівнює імені програми,

argv [1] вказує на перший парамет і т. д. до argv [argc-1].

Нехай:

void main (int argc, char * argv [] , char * envp []);

 

Якщо ми наберемо команду

$ a.out a1 a2 a3

 

то функція main програми з файлу a.out викличеться з

 

argc = 4 / * кількість аргументів * /

argv [0] = "a.out"

argv [1] = "a1"

argv [2] = "a2"

argv [3] = "a3"

argv [4] = NULL

 

Якщо програма не передбачає прийом аргументів, то argc і argv можуть бути опущені. Робота з аргументами командного рядка зводиться до перегляду параметрів argc і argv.

 

Наведемо приклад програми, яка виводить ім'я програми, кількість переданих параметрів і значення цих параметрів.

 

# Include <stdio.h>

int main (int argc, char * argv [])

{printf("The name of this program is '% s'. \ N", argv [0]);

printf ("This program was invoked with% d arguments. \ n ", argc-1);

/ * Чи є хоч один аргумент? * /

If (argc> 1)

{int i;

printf ("The arguments are: \ n");. •

for (i = 1; i <argc; + + i)

printf ("% s \ n", argv [i]);}

return 0;}

 

2. Змінні оточення

 

ОС UNIX надає кожній виконуваній програмі середовище виконання або, кажучи іншими словами, оточення програми. Під середовищем мається на увазі сукупність пар змінна-значення. Ці змінні називаються змінними оточення. Імена змінних оточення та їх значення є рядками. За існуючою угодою змінні оточення записуються великими літерами.

Наприклад:

USER - містить ім'я поточного користувача;

HOME - містить шлях до початкового каталогу поточного користувача;

PATH - містить розділений двокрапками список каталогів, які операційна система переглядає в пошуку викликаної програми.

Стандарт POSIX.1 визначає аргумент envp[] в оголошенні функції main для того, щоб отримати доступ до списку змінних оточення

 

int main (int argc, char * argv [], char * envp []);

Стандарт ANSI C визначає тільки два перші аргументу. Тому рекомендується здійснювати доступ до змінних оточення через глобальну змінну environ:

Наведемо приклад програми, яка виводить всі змінні оточення програми.

 

# Include <stdio.h>

extern char ** environ;

int main (int argc, char * argv [])

{char ** var;

for (var = environ; * var! = NULL; + + var)

printf (" % s \ n ", * var);

return 0;}

Для отримання та встановлення конкретних значень змінних оточення використовуються функції getenv() і putenv().

 

# Include <stdlib.h>

char * getenv (const char * name)

int putenv (const char * string)

Введене значення змінної буде доступно в даному процесі і його дочірніх. Тому, для того, щоб побачити результат дії, треба виводити список змінних оточення в тій же програмі, де відбувається установка значення.

 

Для установки и сброса значений переменных окружения предназначены функции setenv() и unsetenv() соответственно.

Обычно при запуске программа получает копию среды своей родительской программы (интерпретатора команд, если она была запущена пользователем). Таким образом, программы, запущенные из командной строки, могут исследовать среду интерпретатора команд.

 

3. Індівідуальні завдання

1. Вивести список імен всіх змінних оточення процесу (без значень).

2. Вивести список значень всіх змінних оточення процесса (без імен).

3. Вивести значення змінної оточення, ім'я якої ука-ано першим аргументом командного рядка (якщо він відсутній, запитати з клавіатури); якщо змінній не существуєт, створити її, значення узяти з другого аргументу командного рядка (якщо він відсутній, запитати з клавіатурі).

4. Вивести імена і значення змінних оточення, імена яких вказані в командному рядку запуску програми.

5. Вивести список імен і значень змінних оточення процесу; за наявності аргументу-опції –t наступний аргумент вважати символами, з яких повинні починатися імена змінних, що відображуються; за відсутності опції відображувати всі змінні.

6. Вивести список імен і значень змінних оточення процесу; за наявності аргументу-опції –t наступний аргумент вважати символами, з яких повинні починатися значення змінних, що відображуються; за відсутності опциі відображувати всі змінні.

7. Обробити два аргументи командного рядка: якщо аргументи є іменами існуючих змінних оточення процесу, вивести їх значення на екран; якщо існує лише одна змінна, задати їй нове значення, узявши його з другого аргументу; якщо вказані змінні відсутні, створити нову змінну, узявши її ім'я з першого аргументу, а значення – з другого.

8. Виконати певну дію із змінною оточення, ім'я якої вказане в командному рядку, в залежності від аргументу-опції: при –d – видалити змінну, якщо вона існує; при –p – вивести значення, якщо вона існує, при –c – створити, узявши ім'я і значення з наступних аргументів.

9. Створити копії всіх змінних оточення у вигляді нових змінних оточення з іменами вигляду <ім’я_змінної>1 і відповідними значеннями су-ществующих змінних (наприклад, для PATH – Path1 з тим же значенням).

10. Якщо існує змінна оточення з ім'ям, вказаним в командному рядку, створити нову змінну з ім’ям, рівним значенню вказаної змінної, і значенням, рівним імені вказаної змінної (наприклад, для змінної Editor=mcedit створити змінну mcedit=editor). Обробити аналогічним чином всі вказані аргументи.

11. Заздалегідь створити змінну оточення MYENVS із зна-ченієм вигляду "ім’я1{;ім’я2;им’я3...}" (список імен існуючих змінних оточення). У програмі прочитати список імен і вивести на екран значення відповідних змінних оточення.

12. Заздалегідь створити змінну оточення NEWENV із зна-ченієм вигляду "ім’я:значння". У програмі прочитати це значення і створити нову змінну оточення з соот-ветствующимі ім'ям і значенням.

13. Доповнити значення змінної оточення PATH шляхом (ім'ям каталога), вказаним у командному рядку запуску програми. (виключити повтори). Обробити всі аргументі аналогічним чином.

14. Створити змінну оточення ENVVARS із значенням, складеним з імен і значень всіх змінних оточення процесу (роздільник між ім'ям і значенням – знак ''-'', роздільник між значенням і ім'ям наступної змінної - символ '';'', наприклад, Envvars=backspace-delete;BASH-/bin/bash;...).

15. Створити змінну оточення з ім'ям PATHL і значенням, рівним останньому шляху з набору шляхів змінною оточення PATH.

16. Вивести імена і значення змінних оточення, в іменах або значеннях яких зустрічається рядок, вказаний аргументом командного рядка запуску програми.

17. Визначити і вивести на екран розмір оточення процесу: загальну довжину всіх рядків змінних оточення в байтах і кількість змінних оточення.

18. Вивести на екран всі змінні оточення у вигляді двох колонок: ім'я і значення (дані в колонці вирівняні по лівому краю).

19. Визначити, чи існують в оточенні процесу змінні з однаковими значеннями; якщо так – вивести значення і список імен змінних для кожного такого значення.

20. Вивести на екран кількість змінних оточення, ім'я яких починається з символу, вказаного в командному рядку програми (якщо символ не вказаний – кількість всіх змінних оточення).

21. Для змінної оточення, вказаної в командному рядку програми, вивести ім'я, значення, загальну довжину (включаючи ім'я і значення), а також порядковий номер в списку змінних оточення.

22. Доповнити оточення програми змінними, заданими в командному рядку у вигляді рядків "Ім’я=значення".

23. Вивести на екран змінні оточення програми, імена яких містять рядкові (маленькі) букви.

24. Для вказаної в командному рядку змінної оточення визначити довжини імені і значення; створити дві нові змінні оточення LENN і LENV із значеннями цих довжин.

25. Вивести на екран імена і значення змінних оточення, довжина імен яких дорівнює числу, вказаному в командному рядку програми.