Создание процессов и исполнение программ



Скачать 336,76 Kb.
страница4/7
Дата12.09.2017
Размер336,76 Kb.
1   2   3   4   5   6   7

Исполняемая программа - Пример


Эта программа будет использоваться для демонстрации системных вызовов семейства exec(2) в последующих примерах. Эта программа распечатывает свои аргументы командной строки и переменные среды исполнения.

12-13 Этот цикл распечатывает аргументы командной строки.

16-17 Этот цикл распечатывает переменные среды исполнения.

Файл: newpgm.c

ИСПОЛНЯЕМАЯ ПРОГРАММА - ПРИМЕР
1 #include

2 extern char **environ;

3

4 /* program to be exec(2)'ed */



5

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

7 {

8 char **p;



9 int n;

10

11 printf("My input parameters(argv) are:\n");



12 for (n = 0; n < argc; n++)

13 printf(" %2d: '%s'\n", n, argv[n]);

14

15 printf("\nMy environment variables are:\n");



16 for (p = environ; *p != 0; p++)

17 printf(" %s\n", *p);

18 }
$ newpgm parm1 parm2 parm3

My input parameters(argv) are:

0: 'newpgm'

1: 'parm1'

2: 'parm2'

3: 'parm3'


My environment variables are:

HOME=/uxm2/jrs

LOGNAME=jrs

MAIL=/var/mail/jrs

PATH=/usr/bin:/usr/lbin/:/uxm2/jrs/bin:.

TERM=5420

TZ=EST5EDT

      1. Использование execl(2) - Пример

Эта программа демонстрирует использование системного вызова execl(2).

9-10 Системный вызов execl(2) использует список параметров.

newpgm имя программы, которую следует исполнить

newpgm значение argv[0] новой программы

parm1 значение argv[1] новой программы

parm2 значение argv[2] новой программы

parm3 значение argv[3] новой программы

(char *)0 конец списка параметров. Он необходим, потому что в C/C++ функция с переменным количеством аргументов (a execl(2) является именно такой функцией) не имеет встроенных в язык средств, чтобы определить, сколько ей было передано аргументов (см. varargs(3EXT)).

12 Исходная программа exec1 распечатает сообщение об ошибке, только если execl(2) завершится неудачно. Это может произойти, например, если требуемая программа не может быть исполнена или был передан неправильный параметр, такой как недопустимый указатель на один из аргументов.

Когда исполняется newpgm, из параметров execl(2) создается новый список argv[]. Переменные среды исполнения наследуются от вызывающего процесса.

Файл: exec1.c

ИСПОЛЬЗОВАНИЕ execl(2) - ПРИМЕР
1 #include

2 #include

3

4 main()


5 {

6

7 printf("this is the original program\n");



8

9 execl("newpgm", "newpgm", "parm1", "parm2",

10 "parm3", (char *) 0);

11

12 perror("This line should never get printed\n");



13 }
$ exec1

this is the original program

My input parameters(argv) are:

0: 'newpgm'

1: 'parm1'

2: 'parm2'

3: 'parm3'
My environment variables are:

HOME=/uxm2/jrs

LOGNAME=jrs

MAIL=/var/mail/jrs

PATH=/usr/bin:/usr/lbin/:/uxm2/jrs/bin:.

TERM=5420

TZ=EST5EDT

      1. Использование execv(2) - Пример


Эта программа исполняет новую программу, используя execv(2).

6-8 nargv[] - массив указателей на строки, представляющие собой аргументы новой программы. Последним элементом nargv[] должен быть нулевой адрес, отмечающий конец списка. В этом примере аргументы таковы: "diffnm", "parm1", "parm2" и "parm3".

Замечание: nargv[0] отличается от первого параметра execv - имени запускаемой программы.

13 Второй аргумент execv(2) - адрес массива, содержащего адреса параметров новой программы. Использование списка позволяет динамически формировать этот список в программе.

Переменные среды наследуются от вызывающего процесса.

Файл: exec2.c

ИСПОЛЬЗОВАНИЕ execv(2) - ПРИМЕР
1 #include

2 #include

3

4 main()


5 {

6 char *nargv[ ] = {

7 "diffnm", "parm1", "parm2", "parm3",

8 (char *) 0 };

9

10 printf("this is the original program\n");



11

12 execv("newpgm", nargv);

13

14 perror("This line should never get printed\n");



15 }
$ exec2

this is the original program

My input parameters(argv) are:

0: 'diffnm'

1: 'parm1'

2: 'parm2'

3: 'parm3'
My environment variables are:

HOME=/uxm2/jrs

LOGNAME=jrs

MAIL=/var/mail/jrs

PATH=/usr/bin:/usr/lbin/:/uxm2/jrs/bin:.

TERM=5420

TZ=EST5EDT

      1. Использование execve(2) - Пример

Эта программа исполняет новую программу с помощью execve(2)

9-13 nenv[] - список указателей на новые значения переменных среды исполнения. Он имеет такую же форму, как и nargv[]. Каждый элемент nenv[] указывает на строку, похожую на оператор присваивания shell: "имя=значение"

17 Третий параметр execve(2) - это адрес списка новых переменных среды.

18-19 Закомментирован вызов execle(2). Он приведёт к тому же результату.

Файл: exec3.c

ИСПОЛЬЗОВАНИЕ execve(2) - ПРИМЕР
1 #include

2 #include

3

4 main()


5 {

6 char *nargv[ ] = {

7 "newpgm", "parm1", "parm2", "parm3",

8 (char *) 0 };

9 char *nenv[ ] = {

10 "NAME=value",

11 "nextname=nextvalue",

12 "HOME=/xyz",

13 (char *) 0 };

14

15 printf("this is the original program\n");



16

17 execve("newpgm", nargv, nenv);

18 /* execle("newpgm", "newpgm", "parm1", "parm2",

19 "parm3", (char *) 0, nenv); */

20

21 perror("This line should never get printed\n");



22 }
$ exec3

this is the original program

My input parameters(argv) are:

0: 'newpgm'

1: 'parm1'

2: 'parm2'

3: 'parm3'
My environment variables are:

NAME=value

nextname=nextvalue

HOME=/xyz




      1. Поделитесь с Вашими друзьями:
1   2   3   4   5   6   7


База данных защищена авторским правом ©grazit.ru 2017
обратиться к администрации

    Главная страница