【发布时间】:2018-03-04 08:56:45
【问题描述】:
我正在尝试使用exec 来执行作为参数给出的命令列表。
程序运行时的示例输入为 ./assn2 ls date。
当我这样做时,只执行第一个命令。
#include<stdio.h>
#include<stdlib.h>
#include<sys/wait.h>
#include<unistd.h>
int main(int argc, char *argv[])
{
int args = argc-1;
pid_t childpid = fork();
// error
if (childpid < 0)
{
perror("fork() error");
exit(-1);
}
// parent process
if (childpid != 0)
{
printf("Parent Process started, now waiting for ID: %d\n", childpid);
wait(NULL);
printf("Parent Process resumeed. Child exit code 0. Now terminating\n");
exit(0);
}
// child process
if (args > 0)
{
printf("Child process has begun. %d argument/s provided\n", args);
int i;
for (i = 1; i <= argc; i++)
{
execlp(argv[i], argv[i], NULL);
}
execvp(argv[1], argv);
}
else
{
printf("No arguments provided, terminating child\n");
}
return 0;
}
【问题讨论】:
-
for(i = 1; i <= argc; i++)- 这超出了数组范围。结束exec*函数不返回,所以显然你不能在同一个进程中顺序执行它们.. -
如果你要执行两个程序,你需要两个子进程,所以你需要调用
fork两次。我相信您会希望将fork调用移入循环中。如果你只有一个子进程(就像你在这里所做的那样),一旦你成功调用了 exec,你就用你执行的新代码覆盖了那个进程,你以后对 exec 的调用将永远不会发生。 -
execlp(argv[i] ,argv[i], NULL);-->execlp(argv[i] ,argv[i], (void*)NULL);需要转换为NULL可能是int0。Ref