правильное использование команды exec для вызова wget в unix

я пытаюсь вызвать wget из программы c++ в unix. Я хочу вызвать его внутри дочернего процесса после использования fork, мне нужно использовать exec, а не system(). что я сделал

pid_t pID = fork();
if (pID == 0)
{
   execl("/bin/wget","wget", "http://google.gr",(char*)0);
}

и ожидайте, что html-файл будет в той же папке, что и исполняемый файл, но этого не происходит, как мне правильно это сделать?


person user985409    schedule 22.05.2012    source источник
comment
Я бы не советовал указывать путь полностью — не каждая система, на которой установлено ваше программное обеспечение, обязательно будет иметь wget в /bin; иногда это может быть в /usr/bin, /usr/local/bin и т. д.; и пользователь, запускающий ваше программное обеспечение, может иметь собственный wget, который он хочет использовать в своем локальном PATH перед этим. Просто вызов с "wget" в первом аргументе приведет к поиску PATH, так что двоичный файл будет найден, где бы он ни находился.   -  person Charles Duffy    schedule 22.05.2012
comment
Большое спасибо, на самом деле я ошибся, потому что путь /usr/bin/wget, но ваша рекомендация вызывать его с помощью wget в первом аргументе является правильным решением, еще раз спасибо   -  person user985409    schedule 22.05.2012
comment
Я добавил ответ, описывающий использование правильной обработки ошибок — при этом ваша программа выдаст ошибку «файл не найден» в этом случае, поэтому будет очевидно, в чем проблема, — и повторит содержание комментария выше.   -  person Charles Duffy    schedule 22.05.2012


Ответы (1)


Во-первых, не используйте /bin/wget -- wget не всегда будет устанавливаться в /bin; просто передача только wget в первом аргументе приведет к поиску PATH.

Во-вторых, вы не должны предполагать, что execl не вернется. Скорее, вы должны вызвать perror(), чтобы правильно зарегистрировать ошибку (а затем, в вашем коде, выйти с ненулевым статусом) после нее.

Вы также можете увидеть, что происходит, используя strace -f для родительского процесса и поиска exec, но добавление обработки ошибок в ваш код в любом случае будет правильным решением.

person Charles Duffy    schedule 22.05.2012