可运行的POSIX示例代码: argv [0] == NULL
caller.c
#define _XOPEN_SOURCE 700
#include <unistd.h>
int main(void) {
char *argv[] = {NULL};
char *envp[] = {NULL};
execve("callee.out", argv, envp);
}
callee.c
#include <stdio.h>
int main(int argc, char **argv) {
if (argc == 0 && argv[0] == NULL)
puts("yup");
}
然后:
gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o caller.out caller.c
gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o callee.out callee.c
./caller.out
输出:
yup
测试使用空参数列表的现有程序
这里有一个以路径作为参数并以无参数形式运行该命令的包装器:
caller-any.c
#include <unistd.h>
#include <stdio.h>
int main(int argc, char**argv) {
char *empty[] = {NULL};
execve(argv[1], empty, empty);
}
示例用法:
./caller-any.out /bin/ls
然而,GNU Coreutils工具(如ls
)会检查argv[0]
是否为NULL,正如在此处提到的:为什么execve系统调用可以运行“/bin/sh”而没有任何argv参数,但不能运行“/bin/ls”?,并且ls
输出:
A NULL argv[0] was passed through an exec system call.
Aborted (core dumped)
在 Ubuntu 19.04 中进行了测试。