标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。标准I/O提供三个类型的缓冲:全缓冲、行缓冲和不带缓冲。标准输入(stdin)和标准输出(stdout)是行缓冲,标准出错(stderr)是不带缓冲的。行缓冲指当在输入输出中遇到换行符时,标准I/O库执行I/O操作。
fork函数:
1 #include <unistd.h> 2 pid_t fork(void) 3 /*返回值: 4 * 子进程中返回0,父进程中返回子进程ID,出错返回-1 5 */
子进程和父进程继续执行fork调用之后的指令。子进程是父进程的副本。子进程获得父进程数据空间、堆和栈的副本。
1 #include <unistd.h> 2 #include <stdio.h> 3 int 4 main() 5 { 6 int i=0; 7 for(i=0;i<2;i++) 8 { 9 fork(); 10 printf("-"); 11 } 12 printf(" "); 13 return 0; 14 }
执行该程序结果截图:
改进一下程序:
1 #include <unistd.h> 2 #include <stdio.h> 3 int 4 main() 5 { 6 int i=0; 7 for(i=0;i<2;i++) 8 { 9 fork(); 10 printf("-"); 11 } 12 printf("pid=%d ",getpid()); 13 sleep(10); 14 return 0; 15 }
运行结果截图:
本程序会产生4个进程。一个主进程,执行两次输出“-”。一个子进程执行两次输出“-”,另外两个子进程执行一次输出“-”,但是它们被fork生成时复制了父进程的输出缓冲区。