我试图了解如何正确使用fork()和execvp()来执行命令。到目前为止,我有以下代码:
当我运行./test vim myFile.c
时,它正确打开myFile.c
,但我的行为很奇怪。好像有两个进程在运行,因为每当我输入任何内容时,它似乎都会发生两次。这是为什么?
int main (int argc, char* argv[]) {
int fdin, pid, w, status;
fdin = 0;
if ((pid = fork()) < 0)
errorExit (EXIT_FAILURE);
execvp(argv[0],argv);
do {
w = waitpid(cpid, &status, WUNTRACED | WCONTINUED);
if (w == -1) {
perror("waitpid");
exit(EXIT_FAILURE);
}
if (WIFEXITED(status)) {
printf("exited, status=%d\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("killed by signal %d\n", WTERMSIG(status));
} else if (WIFSTOPPED(status)) {
printf("stopped by signal %d\n", WSTOPSIG(status));
} else if (WIFCONTINUED(status)) {
printf("continued\n");
}
} while (!WIFEXITED(status) && !WIFSIGNALED(status))
}
答案 0 :(得分:3)
您的计划中的父母和子女都会获得execvp()
:
if ((pid = fork()) < 0)
errorExit (EXIT_FAILURE);
execvp(argv[0],argv);
如果您与父母pid != 0
在一起,您应该检查,如果您还是孩子,则应该检查。
答案 1 :(得分:3)
当您调用fork()时,您将创建两个几乎完全相同的进程,父进程和子进程。这两个进程之间的唯一区别是fork()的返回值,它返回0到子进程,子进程的pid返回到父进程。
因此,假设fork成功,fork将向第4行中的父进程和子进程返回一个非负整数。然后,父进程和子进程将执行第6行execvp,因此,最终得到两个运行你的vim myFile.c的不同进程,导致你描述的所有问题。
标准习语就像:
if ((pid = fork()) < 0) {
// Handle fork error
}
else if (pid == 0) {
// Child process
execvp(...);
}
else {
// Parent process
w = waitpid(pid, ...);
}
由于fork的返回值为0,因此在fork成功后,对于子进程,test(pid == 0)将为true,因此将调用execvp。
对于父级,fork返回子级的pid,因此仍然执行的检查(pid == 0)为false,因此执行else条件,导致父级等待子级。 / p>
答案 2 :(得分:0)
你应该查看fork的返回值,在成功的fork之后,你将在程序中的相同位置有两个正在运行的进程。子进程的返回值为0,父进程将得到一个返回值,即子进程的pid。很可能你想在子进程和父进程中做不同的事情。
您可能还想再次考虑如何调用execvp。你真的想给#34; ./ test&#34;作为execvp的第一个参数?