【发布时间】:2020-12-30 15:03:15
【问题描述】:
我对 Linux 还很陌生,所以请多多包涵。我正在尝试从终端执行命令行参数,每个参数都是可执行文件的完整路径。例如,这样的命令行:
./cmdarguments /Desktop/darren/lab01/c_ex1/a.out
这意味着cmdarguments 是我的父程序,下面的命令行是我希望执行的文件的路径,它只是打印出hello world。
这是我目前的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
int counter;
for(counter = 0; counter < argc; counter++){
pid_t pid = fork();
if(pid < 0)
{
perror("Forking failed\n");
exit(1);
}
else if(pid == 0)
{
char *args[] = {argv[counter], NULL};
execvp(args[0], args);
printf("Command completed.\n");
exit(0);
}
}
exit(0);
}
我知道我的代码中可能缺少很多内容,从我在网上阅读的内容来看,我只会让自己更加困惑。这是一项仅使用fork 和exec 的简单任务。现在,我当前的输出只是Command completed,而我用作第二个命令行参数的任何输出似乎都没有改变,它始终是Command completed。
【问题讨论】:
-
counter = 0。argv[0]是./cmdarguments -
使用调试器。检查您传递给
execvp的参数 - 是您所期望的吗? -
@KamilCuk 好的,所以我应该从 1 开始我的计数器,以便在第 0 个参数的父程序之后获取参数?
-
@kaylum 据我了解,execvp 的第一个参数是父程序,应该是第 0 个参数是吗?
-
请注意,如果成功,
execvp将不会返回。所以printf("Command completed.\n");应该是perror("Command failed");。另外,不要在传递给perror的字符串末尾添加\n,因为perror将打印您的消息,后跟冒号、错误描述和换行符。