我有一个C程序,用于处理子进程,我从linux shell运行。
我的问题是,在分叉之后,父进程移动到shell后台。我希望父进程保持在前台。
这是一个简单的例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int i;
for (i = 0; i < 3; i++) {
printf("Before Fork\n");
sleep(1);
}
printf("forking...\n");
pid_t pid = fork();
if (pid) {
// child
printf("Child started and now exiting\n");
exit(EXIT_SUCCESS);
}
// parent
wait(NULL);
for (i = 0; i < 3; i++) {
printf("After Fork\n");
sleep(1);
}
return 0;
}
输出(稍后添加评论)
Before Fork
Before Fork
Before Fork
forking...
Child started and now exiting
After Fork
gregp@gregp-ubuntu:~/fork_example$ After Fork # <--- User returned to shell
After Fork
请注意,在fork之后不久,用户将返回到shell提示符,程序将继续在后台运行。我不希望这种情况发生。我希望程序继续在前台运行。
所需输出(稍后添加评论)
Before Fork
Before Fork
Before Fork
forking...
Child started and now exiting
After Fork
After Fork
After Fork
# Program now exits and user returns to shell
gregp@gregp-ubuntu:~/fork_example$
答案 0 :(得分:3)
在父母中返回pid,因此您的条件应为
if (!pid)
因为代码中的孩子不会转到if。那是因为
成功时,子进程的PID在父进程中返回, 在孩子身上返回0。失败时,返回-1 parent,没有创建子进程,并且正确设置了errno。
答案 1 :(得分:2)
答案 2 :(得分:1)
你需要围绕wait()
进行循环。如上所述,它等待一个孩子完成(忽略返回的PID并且不设置状态)。 shell的wait
命令与系统调用不同 - 但代码看起来好像是用shell命令编写的。
首先由他人识别 - 他们得到了信用。
wait()
循环问题仅在您修复if (pid)
测试后才有意义...我想知道如果你写了if (pid == 0) { // Child
,你是否犯了错误?可能不是;你知道fork()
会将子项的PID返回给父项,而将{0}返回给子项。明确有帮助。