Хрестоматия по программированию на Си в Unix




Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix - стр. 5


Файл должен иметь код доступа "выполнение". Первые два байта файла (в его заголовке), рассматриваемые как short int, содержат так называемое "магическое число" (A_MAGIC), свое для каждого типа машин (смотри include-файл <a.out.h>). Его помещает в начало выполняемого файла редактор связей ld при компоновке программы из объектных файлов. Это число должно быть правильным, иначе система откажется запускать программу из этого файла. Бывает несколько разных магических чисел, обозначающих разные способы организации программы в памяти. Например, есть вариант, в котором сегменты text и data склеены вместе (тогда text не разделяем между процессами и не защищен от модификации программой), а есть - где данные и текст находятся в раздельных адресных пространствах и запись в text запрещена (аппаратно).

Остальные аргументы вызова - arg0, ..., argn - это аргументы функции main новой программы. Во второй форме вызова аргументы не перечисляются явно, а заносятся в массив. Это позволяет формировать произвольный массив строк-аргументов во время работы программы:

char *argv[20]; argv[0]="ls"; argv[1]="-l"; argv[2]="-i"; argv[3]=NULL; execv( "/bin/ls", argv); либо execl( "/bin/ls", "ls","-l","-i", NULL):

В результате этого вызова текущая программа завершается (но не процесс!) и вместо нее запускается программа из заданного файла: сегменты stack, data, text старой программы уничтожаются; создаются новые сегменты data и text, загружаемые из файла path; отводится сегмент stack (первоначально - не очень большого размера); сегмент user сохраняется от старой программы (за исключением реакций на сигналы, отличных от SIG_DFL и SIG_IGN - они будут сброшены в SIG_DFL). Затем будет вызвана функция main новой программы с аргументами argv:

void main( argc, argv ) int argc; char *argv[]; { ... }

Количество аргументов - argc - подсчитает сама система. Строка NULL не подсчитывается.




Содержание  Назад  Вперед