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()之前执行?
答案 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());
}