6

我正在尝试fork()重新定向以检查在父级中完成的重新定向是否也适用于子级。我写了以下简单的程序

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main ()
{
    freopen( "error.txt", "w+t", stdout ); // From now on, stdout = error.txt
    printf (" ERROR!  WHY DONT U UNDERSTAND?\n");
    if ( fork() == 0 ) 
    {   
        printf(" I AM CHILD\n");
        exit(0);
    }   
    else-
    {   
        printf (" EITHER I AM A PARENT OR SOMETHING GOT SCREWED\n");
    }   


    return 0;
}

error.txt我得到的输出( )是

ERROR!  WHY DONT U UNDERSTAND?
EITHER I AM A PARENT OR SOMETHING GOT SCREWED
ERROR!  WHY DONT U UNDERSTAND?
I AM CHILD

令人惊讶的是,ERROR! WHY DONT U UNDERSTAND?打印两次,即使它在fork()调用之前出现很多并且应该只由父打印一次。

任何人都可以对此有所了解吗?

4

4 回答 4

10

由于在reopen流是非交互式之后,它是完全缓冲的并且不会在'\n'. 在fork调用之前,缓冲区仍然包含消息,而在fork此缓冲消息被复制之后(因为两个进程都有自己的副本stdout),然后由父进程和子进程刷新。请参阅 C 标准的第 7.19.3 部分。

fflush您可以通过调用before来避免这种行为fork

于 2012-05-22T10:31:03.207 回答
3

这是因为缓冲。做一个fflush正确的之后printf

这两个进程最终都得到了stdio's 内部内容的相同副本,并且都继续在exit. 如果你打电话_exit给孩子,你也可以防止它发生。

于 2012-05-22T10:29:43.293 回答
1

刷新缓冲区将解决问题。在 print 语句之后使用 fflush 。

于 2012-05-22T10:31:03.433 回答
0

似乎ERROR! WHY DONT U UNDERSTAND在分叉后仍然缓冲并被两个进程写入。

如果你添加

fflush(stdout);

在您第一次printf()刷新内部缓冲区之后,它只在您的文件中出现一次。

于 2012-05-22T10:33:48.563 回答