Child的printf未显示在父进程'console

时间:2016-06-25 18:27:21

标签: c linux system-calls

我有以下代码:

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

// child process is forked. 
// the child executes "ls -al"
// the parent process "waits" for the child and collects it

int main(void) {

    char *args[3];
    pid_t pid;

    printf("i am a parrent and my pid=%d\n",getpid());
    if ((pid = fork()) < 0)
        fprintf(stderr, "fork error");
    else if (pid == 0) {
        /* child */
        printf("i am a child and my pid=%d",getpid());
        args[0] = strdup("ls");
        args[1] = strdup("-al");
        args[2] = NULL;
        if (execvp(args[0], args) < 0)
            fprintf(stderr, "exec error");
    }
    printf("my child got pid=%d\n",pid);
    /* parent */
    if (waitpid(pid, NULL, 0) < 0)
        fprintf(stderr, "waitpid error");
    exit(0);
}

导致此输出:

i am a parrent and my pid=11745 
my child got pid=11750 
total 144
drwxr--r-- 3 student student  4096 Jun 25 21:18 .
drwxrwxr-x 4 student student  4096 May 24 17:18 ..

其他一些文件......

我的问题是: 为什么孩子的printf ("i am a child...")输出没有显示在控制台中,ls的输出是?如何在与父进程相同的控制台上显示它?

1 个答案:

答案 0 :(得分:0)

首先,您需要fflush(stdout);之前的fork,否则您可能会输出 您是父母和孩子的标准缓冲区中的printf("i am a parrent and my pid=%d\n",getpid());。 然后,在fflush(stdout)调用之前,您需要fcloseall()exec,因为exec会完全浪费您的旧过程映像,并且输出缓冲区会随之丢失。

或者,您可以切换到线路缓冲或关闭它。

在处理exec错误时,除了打印错误之外,您还应该_exit,否则它将继续沿着父级路线继续。