执行fork后printf的输出问题

来源:互联网 发布:软件许可协议 英文 编辑:程序博客网 时间:2024/06/05 02:50
int main(void){    printf("123456\n");    if(fork())        exit(1);    else        exit(1);

}

终端上输出:

~$ ./a.out

123456

输出重定向到文件后读取文件:

~$ ./a.out > test

~$ cat test

123456

123456

原因:

当直接由终端输出时,此时标准io采用行缓冲,即缓冲区有换行符后马上输出:

进程执行./a.out时,代码运行至printf("123456\n");终端检测到缓冲区中有换行符,此时直接冲刷缓冲区,将数据输出,缓冲区为空,以至于后面执行fork()时

因为父进程缓冲区中并没有数据,子进程复制的缓冲区也为空,子进程结束后,并没有数据输出


当输出重定向到文件时,此时标准io采用全缓冲,即缓冲区必须满一定大小后才会输出,进程结束时会刷新缓冲区,输出数据,或者调用fflush():

由于采用全缓冲,缓冲区的数据并没有直接输出,因为缓冲区并没有满,以至于后面fork()函数执行时子进程也复制了父进程的缓冲区,此时两个缓冲区中都有123456\n

的数据,当父进程和子进程结束时,两个缓冲区都会被冲刷,所以123456有两行


int main(void){    printf("123456");    if(fork())        exit(1);    else        exit(1);}
去掉换行符'\n'后

终端上输出:

~$ ./a.out

123456123456

输出重定向到文件后读取文件:

~$ ./a.out > test

~$ cat test

123456123456

此时的结果相同,因为没有换行符

------------------------------------------------------------------

进一步的实验

int main(void){    printf("123456\n");    sleep(2);}

int main(void){    printf("123456");    sleep(2);}
比较两种输出到终端的结果

上面一个程序会在程序运行后立刻输出123456,之后睡眠两秒,进程终止

下面一个程序会在程序运行后先睡眠两秒,然后输出123456,进程终止


原创粉丝点击