(1.1.20)C程序之Fock()函数

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值