LINUX.ORG.RU

execl

 , , ,


0

1

ЛОР, скажи, почему первый вызов execl фейлится, хотя в PATH, очевидно, есть все, что надо?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main(void)
{
    printf("PATH=%s\n", getenv("PATH"));
    execl("sh", "sh", NULL);
    printf("%s\n", strerror(errno));
    execl("/usr/bin/sh", "sh", NULL);
    return 0;
}

Вывод:

PATH=/usr/lib/qt/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/android-ndk:/opt/android-sdk/platform-tools:/opt/android-sdk/tools:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
No such file or directory
sh-4.3$ Вот во второй раз все запустилось почему-то.
sh: Вот: command not found
sh-4.3$ exit

Ага, если юзать execlp, то все хорошо.

Kotolegokot
() автор топика

Очевидно PATH нужно парсить самому.

crutch_master ★★★★★
()

А разве первый аргумент не должен быть абсолютным путем?

kirk_johnson ★☆
()

Все хорошо, просто маны читать нужно правильно:

Special semantics for execlp() and execvp()

The execlp(), execvp(), and execvpe() functions duplicate the actions of the shell in searching for an executable file if the specified filename does not contain a slash (/) character. The file is sought in the colon-separated list of directory pathnames specified in the PATH environment variable. If this variable isn't defined, the path list defaults to the current directory followed by the list of directories returned by confstr(_CS_PATH). (This confstr(3) call typically returns the value «/bin:/usr/bin».)

Kotolegokot
() автор топика

К слову, в мане сказано, что только execlp парсит PATH, т.к. воспроизводит шелл в этом смысле.

lu4nik ★★★
()

The execlp(), execvp(), and execvpe() functions duplicate the actions of the shell in searching for an executable file if the specified filename does not contain a slash (/) character.

kirk_johnson ★☆
()
Ответ на: комментарий от Kotolegokot

Дааа, видать, отстал от жизни здорово. Последний раз, когда юзал, такое еще не запилили.

lu4nik ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.