Листинг 10.4. Программа execve1.c
#include
#include
extern char ** environ;
int main (void)
{
char * uname_args[] = {
"uname",
"-a",
NULL
};
execve ("/bin/uname", uname_args, environ);
fprintf (stderr, "Error\n");
return 0;
}
Итак, в приведенной программе мы заменили образ текущего процесса программой /bin/uname с опцией -a. Если программа была успешно вызвана (независимо от того, как она завершилась), то сообщение "Error" не выводится. В качестве окружения мы воспользовались массивом environ. Рассмотрим еще один пример, демонстрирующий все важные особенности работы системного вызова execve(). Для этого создадим в одном каталоге две программы. Первая (листинг 10.5) будет при помощи execve() запускать вторую программу (листинг 10.6).
Листинг 10.5. Программа execve2.c
Листинг 10.6. Программа newprog.c
#include
#include
extern char ** environ;
int main (int argc, char ** argv)
{
int i;
printf ("ENVIRONMENT:\n");
for (i = 0; environ[i] != NULL; i++)
printf ("environ[%d]=%s\n", i, environ[i]);
printf ("ARGUMENTS:\n");
for (i = 0; i < argc; i++)
printf ("argv[%d]=%s\n", i, argv[i]);
printf ("New PID: %d\n", getpid ());
return 0;
}
Ну и чтобы освежить в памяти материал, создадим небольшой makeфайл (листинг 10.7).
Листинг 10.7. Файл Makefile
Вот что пол$ make
gcc -o newprog newprog.c
gcc -o execve2 execve2.c
$ ./execve2
Old PID: 4040
ENVIRONMENT:
environ[0]=USER=abrakadabra
environ[1]=HOME=/home/abrakadabra
ARGUMENTS:
argv[0]=Tee-hee!
argv[1]=newprog_arg1
argv[2]=newprog_arg2
New PID: 4040училось:
Данный пример демонстрирует сразу три аспекта работы системного вызова
execve():
обе программы выполнялись в одном и том же процессе;
при помощи системного вызова execve() программе можно "подсунуть" любое окружение;
в элементе argv[0] действительно может быть все, что угодно.
Запускаемой программе можно передавать пустое окружение. Для этого достаточно указать NULL в третьем аргументе системного вызова execve(). Следующая небольшая программа демонстрирует это (листинг 10.8).
Достарыңызбен бөлісу: |