如何使用 execvp——查找文件参数
how to use execvp--finding the file argument
我编写了一个测试程序来尝试理解如何使用 execvp(),但我一直 运行 遇到问题。我的代码的相关部分是:
...
printf("execute: 'ls -a'\n");
char *args[2];
args[0] = "/bin/ls";
args[1] = "ls";
args[2] = "-a";
...
} else if(pid == 0){ //child process
if(execvp(*args, args) < 0) { //execute command
fprintf(stderr, "Error: execution failed\n");
exit(1);
}
}
...
每当我 运行 时,我都会收到错误消息“/bin/ls:无法访问 ls:没有这样的文件或目录”。 which ls
告诉我 /bin/ls 所以我不明白我做错了什么。是因为可执行文件不在我的主目录中而是在项目文件中吗?
与此处相同的问题C - error when attempting to pass /bin/ls to execvp
您基本上必须用 NULL 指针终止指针数组。
这里有几个问题:
args
被定义为一个 2 元素数组,但您要放入 3 个元素,所以您写的是数组的末尾。
args
数组需要有一个NULL指针作为最后一个元素,否则execvp
不知道什么时候到达参数列表的末尾。
args
中的第一个元素应该是程序的名称(这是 ps
列表中显示的内容),后续元素应该是参数。现在,您将 ls
作为数组中的第二个元素,这意味着它是命令 /bin/ls
的第一个参数。所以 ls
命令试图在当前目录中找到名为 ls
的文件但找不到。这解释了您收到的错误消息。
应用修复后:
...
printf("execute: 'ls -a'\n");
char *args[3];
char *path = "/bin/ls";
args[0] = "ls";
args[1] = "-a";
args[2] = NULL;
...
} else if(pid == 0){ //child process
if(execvp(path, args) < 0) { //execute command
fprintf(stderr, "Error: execution failed\n");
exit(1);
}
}
我真的认为代码是
char *args[3];
args[0] = "/bin/ls";
args[1] = "-a";
args[2] = NULL;
比
char *args[2];
args[0] = "/bin/ls";
args[1] = "ls";
args[2] = "-a";
我编写了一个测试程序来尝试理解如何使用 execvp(),但我一直 运行 遇到问题。我的代码的相关部分是:
...
printf("execute: 'ls -a'\n");
char *args[2];
args[0] = "/bin/ls";
args[1] = "ls";
args[2] = "-a";
...
} else if(pid == 0){ //child process
if(execvp(*args, args) < 0) { //execute command
fprintf(stderr, "Error: execution failed\n");
exit(1);
}
}
...
每当我 运行 时,我都会收到错误消息“/bin/ls:无法访问 ls:没有这样的文件或目录”。 which ls
告诉我 /bin/ls 所以我不明白我做错了什么。是因为可执行文件不在我的主目录中而是在项目文件中吗?
与此处相同的问题C - error when attempting to pass /bin/ls to execvp
您基本上必须用 NULL 指针终止指针数组。
这里有几个问题:
args
被定义为一个 2 元素数组,但您要放入 3 个元素,所以您写的是数组的末尾。
args
数组需要有一个NULL指针作为最后一个元素,否则execvp
不知道什么时候到达参数列表的末尾。
args
中的第一个元素应该是程序的名称(这是 ps
列表中显示的内容),后续元素应该是参数。现在,您将 ls
作为数组中的第二个元素,这意味着它是命令 /bin/ls
的第一个参数。所以 ls
命令试图在当前目录中找到名为 ls
的文件但找不到。这解释了您收到的错误消息。
应用修复后:
...
printf("execute: 'ls -a'\n");
char *args[3];
char *path = "/bin/ls";
args[0] = "ls";
args[1] = "-a";
args[2] = NULL;
...
} else if(pid == 0){ //child process
if(execvp(path, args) < 0) { //execute command
fprintf(stderr, "Error: execution failed\n");
exit(1);
}
}
我真的认为代码是
char *args[3];
args[0] = "/bin/ls";
args[1] = "-a";
args[2] = NULL;
比
char *args[2];
args[0] = "/bin/ls";
args[1] = "ls";
args[2] = "-a";