使用最简单形式的fork()需要按Enter键完成执行

时间:2017-08-18 17:35:56

标签: c fork

我想运行一些简单的示例来了解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;
}

编译,运行&amp;输出

ss@ss:~$ gcc dd.c -o dd
ss@ss:~$ ./dd
parent process
ss@ss:~$ child process
打印子程序在屏幕程序之后需要按回车键 回到终点站。

terminal wait for enter new command

终端等待输入新命令,如果只是按回车键,写入 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()查看正确输出节目的另一种方法。

2 个答案:

答案 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