LINUX.ORG.RU

Работа с функциями семейства exec

 , , ,


0

2
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>
int main(int argc, char* argv[], char *envp[])
{
 char *p;
 p = getenv("PATH");
 strcat(p, ":.");
 setenv("PATH", p, 1);
 pid_t pid = fork();
 pid_t waitpid();
 if (pid == 0)
 {
  execle("ex1", argv[0], argv[1], argv[2], argv[3], NULL, envp);
 }
 else
 {
  waitpid(pid, NULL, 0);
 }
 return 0;
}
Данная программа считывает параметры командной строки и запускает дочерний процесс с этими параметрами.

Для чего в этой программе нужны следующие строки?
 char *p;
 p = getenv("PATH");
 strcat(p, ":.");
 setenv("PATH", p, 1);

Для чего в этой программе нужны следующие строки?

Для чего автор этого делал можно и самому подумать, а вот реализация этого просто отвратительна! Данный код для 64 битного процесса «корректно» работает только в 3 случаях из 4.

vodz ★★★★★ ()
 char *p;
 p = getenv("PATH");
 strcat(p, ":.");

За такое надо отрывать руки.

slovazap ★★★★★ ()
Ответ на: комментарий от generator_mmf

Может подскажете, что нужно изменить для «корректной» работы?

1. Если вы расширяете использованную память, то её надо вначале динамически получить. То есть узнать, сколько было в предыдущим PATH с учётом нулевого символа и запросить на 2 байта больше. И только после этого копировать и добавлять. Неплохо было б и проверить, что точка уже есть в PATH.

2. execl/execle всё равно не использует PATH, потому первый аргумент должен содержать путь к файлу, так что если файл действительно в текущем каталоге, то изменение PATH с добавлением точки повлияет только для вызова других программ из текущего каталога, которые вызывают через execlp-подобных вызовов.

3. pid_t waitpid(); - это уберите, тянут это с исходников 40-летней давности, когда подключение лишнего include приводило к тормозам, а то и не было такого <sys/wait.h>

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 4)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.