fork与printf缓冲问题

时间:2023-03-09 22:51:15
fork与printf缓冲问题

printf输出条件:

(1) 调用fflush;

(2) 缓冲区满了;

(3) 遇到\n \r这些字符

(4) 遇到scanf这些要取缓冲区的;

(5) 线程或者进程退出;

fork之后会拷贝父进程的缓冲区;

代码:

 #include <unistd.h>
#include <stdio.h> int glob = ;
char buf[ ] = "a write to stdout\n"; int main()
{
int var;
pid_t pid; var = ; if (write(STDOUT_FILENO, buf, sizeof(buf) - ) != sizeof(buf) - ){
perror("write error\n");
return -;
} printf("before fork\n"); if ((pid = fork()) < ){
perror("fork error\n");
return -;
} else if (pid == ){
glob++;
var++;
} else {
sleep ();
} printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var); return ;
}

结果:

[root@AY1404041716143649d3Z forkPrintf]# gcc forkPrintf.c -o forkPrintf
[root@AY1404041716143649d3Z forkPrintf]# ./forkPrintf
a write to stdout
before fork
pid = , glob = , var =
pid = , glob = , var =
[root@AY1404041716143649d3Z forkPrintf]# ./forkPrintf > tmp.out
[root@AY1404041716143649d3Z forkPrintf]# cat tmp.out
a write to stdout
before fork
pid = , glob = , var =
before fork
pid = , glob = , var =

(1) 第一次输入到控制台,write无缓冲直接输出,printf("before fork\n")存在\n行缓冲标识直接输出,而子进程拷贝父进程代码段,随后也会输出最后的printf;

(2) 第二次输入到文件,write无缓冲直接输出,printf("before fork\n")成了全缓冲的并没有输出,子进程拷贝了父进程的缓冲区和代码段,所以当父子进程退出时,刷新缓冲区,均有两条printf输出;