可运行的 POSIX 示例argv[0] == NULL
调用者.c
#define _XOPEN_SOURCE 700
#include <unistd.h>
int main(void) {
char *argv[] = {NULL};
char *envp[] = {NULL};
execve("callee.out", argv, envp);
}
被调用者.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
使用空参数列表测试现有程序
这是一个将路径作为参数的包装器,并将其作为不带参数的命令运行:
来电者-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 系统调用可以在没有任何 argv 参数的情况下运行“/bin/sh”,而不是“/bin/ls”?和ls
输出:
A NULL argv[0] was passed through an exec system call.
Aborted (core dumped)
在 Ubuntu 19.04 中测试。