fork()导致程序在这里分叉,分为两个进程;
子进程拷贝父进程的绝大部分;
(1)示例1
#include<stdio.h>
#include<unistd.h>
int main(){
int i=1;
if(!fork())i++;
printf("%d\n",i); // 输出结果:1 2
if(!fork())i++;
printf("%d\n",i); //输出结果:1 2 2 3
return 0;}
if(!fork())i++; 只有子进程会执行i++
假设开始进程为A
第一次fok(),产生进程B
第一个printf
A输出1
B输出2
第二个fork()
A产生进程A1
B产生进程B1
第二个printf
A输出1
B输出2
A1输出2
B1输出3
(2) 示例2
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
int i;
for(i=0; i<2; i++){
fork();
printf("-");
}
return 0;
}
输出的是8个’-‘
程序一开使,bash产生一个进程P1执行此程序,
P1进入程序后,当i=0时,fork()产生一个子进程P2,同时它自己输出一个’-‘.
P2继承P1的诸如环境变量,PC等环境,P2首现会输出一个’-‘.同时此时i=1,会继续执行for循环—P2先fork()出一个子进程P3,同时再输出一个’-‘.
P3进程为P2的子进程,它会复制其父进程P2的指令,变量值,程序调用栈,环境变量,缓冲区等,它会输出一个’-’
因为这里P3会继承P2的缓冲区,其中有一个’-‘,所以P3会输出两个’-‘.
P1进入程序后,当i=1时,fork()产生另一个它的子进程P4,同时输出一个’-‘.
P4同样会输出一个’-‘.
因为P4为P1的一个子进程它会继承P1的缓冲区,其中有一个’-‘,所以P4会输出两个’-‘.
如果把上面的printf(“-“)改为
printf("-\n");
或着调用fflush清一下缓存.
printf("-");
fflush(stdout);
都可以保正输出6个’-‘
(3)示例3
#include<stdio.h>
#include<sys/types.h>#include<unistd.h>intmain(void){
inti;
for(i=0;i<2;i++){fork();
//注意:下面的printf有“\n”
printf("ppid=%d,pid=%d,i=%d\n",getppid(),getpid(),i);}
sleep(10);//让进程停留十秒,这样我们可以用pstree查看一下进程树return0;}
ppid=8858,pid=8518,i=0
ppid=8858,pid=8518,i=1
ppid=8518,pid=8519,i=0
ppid=8518,pid=8519,i=1
ppid=8518,pid=8520,i=1
ppid=8519,pid=8521,i=1
示例4
不算main这个进程自身,到底创建了多少个进程啊?
int main(int argc, char* argv[])
{
fork();
fork() && fork() || fork();
fork();
}
18
19
20
21
首先,这道题目的考察点1.fork调用一次,返回两次,子进程一次返回0,父进程一次返回pid_t 2. A && B || C 中逻辑与和逻辑或. A && B || C ,当A为假(用0表示),直接短路B,即B不执行.然后把(A && B)堪称一个表达式,当这个表达式值为1, C不执行. 然后分析题目:
20-1=19