原创blog,转载请注明出处
头文件:
#include<unistd.h>我们来看一个简单的例子
#include<unistd.h> #include<sys/types.h> #include<stdio.h> #include<stdlib.h> int main(int argc, char ** argv ) { pid_t result = fork(); if(result < 0) { printf("Error"); } else if(result == 0) { printf("From the son"); } else { printf("From the father"); } }
From the son From the father
再看一个例子
代码
#include<unistd.h> #include<stdio.h> #include<stdlib.h> int main(int argc, char ** argv ) { int i; for(i = 0;i < 2;i++) { fork(); printf("%d\n",i); } }
[root@localhost test]# gcc -o first first.c [root@localhost test]# ./first 0 1 1 0 1 1
#include<unistd.h> #include<stdio.h> #include<stdlib.h> int main(int argc, char ** argv ) { int i; for(i = 0;i < 2;i++) { fork(); printf("%d PPID:%d PID:%d\n",i,getppid(),getpid()); } }
结果
[root@localhost test]# ./first 0 PPID:4984 PID:4985 1 PPID:4985 PID:4986 1 PPID:4984 PID:4985 0 PPID:4424 PID:4984 1 PPID:4984 PID:4987 1 PPID:4424 PID:4984先分析PID,一共有4种,所以一共有4984,4985,4986,4987四个进程,所以4424是最开始的进程(main)的父进程,所以,最开始的进程是4984
其中,输出的顺序按照红色圈中顺序来输出
由图可以看出,在我的这个CentOS系统中,子进程比父进程先执行,执行顺序在不同系统中不一样,所以编程的时候应当不依赖执行某一个系统的顺序。
然后,我们来分析一道经典的笔试面试题
for(i = 0;i < 2;i++) { fork(); printf("%d\n",i); } }和
for(i = 0;i < 2;i++) { fork(); printf("%d",i); } }
各输出了几个0,几个1
对于前者
输出是
0 1 1 0 1 1
输出是
01010101对于前者,在上面已经进行了图解,所以不难理解,对于后者,不少同学会很奇怪,为什么输出了4个0,4个1?
原因是:C语言中,printf函数如果遇到\n,会立即输出缓冲区内所有内容,如果没有\n,会先输出到缓冲区内,等待输出
我们继续画图来分析,
这里在详细解释下:可以这么理解,每次printf的时候,是把本进程的printf缓冲区,加入到总的printf缓冲区(这种说法可能不严谨),比如到红色圈圈3的时候,4985本身在红色圈圈1的时候缓冲区已经有0了,那么再加入1,则本身进程的缓冲区为01,那么加入到printf总的缓冲区就是0101
原创blog,转载请注明出处
原文地址:http://blog.csdn.net/hello_hwc/article/details/39826723