【发布时间】:2014-11-14 22:00:00
【问题描述】:
我试图了解如何正确使用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))
}
【问题讨论】:
-
execvp(argv[0], argv)应该一遍又一遍地继续执行同一个程序(test,而不是vim!),因为您为fork()的父级和子级调用它。 . -
在 fork() 之后,代码需要区分父子节点。您的代码没有区别,因此父母和孩子都在运行代码。所以父母和孩子都在执行 execvp() 函数。要区分,请检查返回的 pid 值,如果 ==0 则在子级中,否则在父级中。让父级(pid not - 0)跳过 execvp 调用