Если вы передаете нулевой указатель в качестве второго или третьего аргумента execve
, ваша программа неверна в соответствии с POSIX; оба эти аргумента должны быть ненулевыми. (Это не все, что четко указано в спецификации execve
, но это там.) В настоящее время я печатаю это в операционной системе, которая обрабатывает передачу нулевых указателей,
execve("executable", 0, 0);
как эквивалент передачи пустых массивов, например.
execve("executable", (char *[]){0}, (char *[]){0});
но я не удивлюсь, если узнаю, что другие операционные системы будут вызывать ошибку сегментации или возвращать -1 с errno
, установленным в EFAULT
или EINVAL
.
Передача пустых массивов для этих аргументов разрешена, но только что выполненная программа получит нулевые аргументы в argc
/argv
, если второй аргумент является пустым массивом, и/или нулевые переменные среды в envp
/environ
, если третий аргумент является пустым массивом. В этих условиях многие программы будут работать со сбоями. Например, очень часто можно увидеть такие вещи, как
int main(int argc, char **argv)
{
if (argc != 4) {
fprintf(stderr, "usage: %s one two three\n", argv[0]);
return 2;
}
// ...
}
где программа неявно предполагает, что argv[0]
всегда будет ненулевым.
Таким образом, вы всегда должны предоставлять непустые массивы для обоих аргументов. Обычное соглашение заключается в том, что если вам больше нечего делать, вы используете
execve(program, (char *[]){program, 0}, environ);
который предоставляет собственное имя программы как argv[0]
и никаких дополнительных аргументов, и тот же набор переменных среды, который вы получили от своего родителя.
person
zwol
schedule
22.09.2017
args
. - person Anirudh Ramanathan   schedule 10.05.2015