我正在学习fork()如何工作,并且在调用execvp(argh[0], argv);
这是我的计划:
int main (int argc, char *argv[])
{
pid_t pid;
pid = fork();
if (pid < 0) { // error occurred
printf("Something went wrong!\n");
exit(-1);
} else if (pid == 0) { // child process
printf("Child process. ");
if(argc == 1 || argc == 0) {
printf("No arguments provided. Terminating child.\n");
exit(0);
} else if(argc == 2) {
printf("One argument provided.\n");
execlp(argv[1], argv[1], NULL);
} else {
printf("More than one argument\n");
execvp(argv[0], argv); // *** It's right here ***
}
} else { // parent process
printf("PARENT started with pid=%d.\n", pid);
int status = 0;
pid_t wait(int *status);
printf("PARENT resumed with status code: %i. Now terminating parent.\n", status);
exit(0);
}
return 0;
}
我尝试使用此代码execvp(argv[0], argv)
执行传递给函数的操作(和参数),但是当我执行./arguments ls -l
时我得到一个无限循环}。我应该如何调用execvp?或者我应该打电话给另一种方法?
感谢您的帮助
--- ---更新
我在答案中提出了更改建议,即调用execvp(argv[1], argv);
(将争论[0]更改为争论[1]),我现在得到cannot access ls: No such file or directory
而不是无限循环。
答案 0 :(得分:4)
执行./arguments ls -l
后,您的代码正在执行execvp("./arguments", {"./arguments", "ls", "-l"})
。你的程序是无限的分叉和调用自己:你已经fork-bomb。 :)
这是因为argv[0]
是您的可执行文件(即 ./ arguments )。
您应该使用argv[1]
代替,如下所示:
execvp(argv[1], &argv[1]);
注意你必须改变第一个和第二个参数。
执行时,该行将等同于:execvp("ls", {"ls", "-l"})
。