为什么孩子中的getchar()没有执行?

时间:2015-11-04 17:31:32

标签: fork

pid = fork();
if( pid == 0)
{
    getchar();
    printf("Hello From Child\n");
}
else
{
    printf("Hello From Parent\n");
}
printf("Hello From %d\n",getpid());

这是我得到的输出:

root@debian:/home/test#./a.out
Hello From Parent
Hello From 2370
root@debian:/home/test# Hello From Child
Hello From 2371

子进程中的printf语句在getchar()之前执行?

2 个答案:

答案 0 :(得分:0)

它正在按预期的顺序执行,但看起来你正在用白色空格字符(返回)来提供它。

如果stdin getchar()中有某些内容在执行时会被读取,那么输出会更清晰一些:

jameson@lime:~$ echo 'a' | ./a.out 
Hello From Parent
Hello From 10312
Hello From Child
Hello From 10313

答案 1 :(得分:0)

对您代码中的getchar的调用正在执行,但是它什么也没读取。它返回一个未经检查的错误。该错误的原因是,在父进程退出后(在打印了其pid之后),当外壳获得控制权时,孩子被踢出了前台组(此处有完整说明:Child process cannot read after the exiting of parent process)。

这是一堆工作代码,其中缺少错误检查:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

extern int errno;

int main (void) {

    int c, errnum;
    pid_t pid;

    pid = fork();
    if (pid == 0)
    {
        c = getchar();
        errnum = errno;

        if (c != EOF)
            printf ("getchar says %d\n", c);

        if (feof (stdin))
            printf ("no input from stdin!\n");

        if (ferror (stdin)) {
            fprintf(stderr, "stdin error: %s\n", strerror (errnum));
        }

        printf("Hello From Child\n");
    }
    else
    {
        printf("Hello From Parent\n");
    }

    printf("Hello From %d\n",getpid());
    
}