我想运行一些简单的示例来了解fork()
系统调用的工作方式。
它的工作但是在打印child process
之后需要按Enter键退出程序。
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid = fork();
if(pid == 0){
printf("child process\n");
}
else{
printf("parent process\n");
}
return 0;
}
ss@ss:~$ gcc dd.c -o dd
ss@ss:~$ ./dd
parent process
ss@ss:~$ child process
打印子程序在屏幕程序之后需要按回车键
回到终点站。
终端等待输入新命令,如果只是按回车键,写入
ss@ss:
然后确定。
或者我们可以输入任何其他终端命令 然后执行。
我想知道为什么会出现这种情况,如果真的程序在打印后完成child process
,为什么终端没有显示ss@ss:~$
这是我的机器信息
gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
uname -a
Linux ss 4.8.0-36-generic #36~16.04.1-Ubuntu SMP Sun Feb 5 09:39:41 UTC 2017 i686 i686 i686 GNU/Linux
修改
除了 Felix Guo 之后,在wait(NULL)
之后添加printf("Parent process")
,迫使父母等待子进程。
我通过在终端中使用>
运算符将程序输出重定向到任意文件,为from找到另一种方法。
执行命令:
./dd > out.txt
它将输出重定向到out.txt文件。 如果我们抓住这个文件:
$cat out.txt
parent process
child process
这是使用fork()
查看正确输出节目的另一种方法。
答案 0 :(得分:4)
您的父进程在等待子进程完成之前退出,因此父进程将完成,这是终端正在等待的内容,因此终端将返回其命令输入状态,从而输出ss@ss...
。然后您的孩子处理打印并将stdout
刷新到屏幕,然后将child process
输出到终端,但由于终端已经输出了提示ss@ss
,因此它会在提示后结束。
解决此问题的方法是等待子进程在父进程中return 0
之前退出。您可以在wait(NULL)
之后使用printf("Parent process")
等待子流程,如下所述:Make parent wait for all child processes
答案 1 :(得分:1)
它可能看起来不像,但终端已准备好在父进程完成后立即接受新命令。
正在发生的是shell正在打印提示符,然后子进程(与shell同时运行)输出一个字符串。如果您先输入另一个命令而不先按Enter键查看另一个提示,您将看到该命令将会运行。
例如:
[dbush@dbush ~]$ ./x1
parent process
[dbush@dbush ~]$ child process
echo hello
hello
[dbush@dbush ~]$
在这里,当光标位于最左侧并运行命令时,我键入echo hello
。