进程创建关于fork()浅解

# include<stdio.h>
    main()
    { int  p1, p2;
    while((p1=fork())= = -1);
    if(p1= =0)
    putchar(‘b’);
    else
      { while((p2=fork())= =-1);
        if(p2= =0)
        putchar(‘c’);
        else
        putchar( ‘a’);
       }
     } 
c语言调用函数while((p1=fork())==-1)是什么意思
相关说明: (p1=fork())==-1是什么情况?
那这个函数是什么意思呢?

int p1,p2;
while((p1=fork())==-1);
if(p1!=0)

while((p2=fork())==-1);
if(p2==0) putchar('b');
else putchar('c');
}
else putchar('a');

说是父进程就输出a,子进程就输出b和c,无法理解啊

(p1=fork())==-1
分解为2步:
p1=fork() 
p1==-1
这么分解,应该清楚了吧?
creates a child process that differs from the parent process only in its PID and PPID, and in the fact that resource utilizations are set to 0. File locks and pending signals are not inheritedsgainhsu的回答就挺好的。
下面是man fork的描述
如果等于赋值语句p1=fork()和循环语句while(p1==-1)的复合写法
fork函数的返回值赋值给p1,则继续执行循环体,并判断p1是否等于-1
fork()应该是一个不带参数,返回一个int型数据的函数吧,
while((p1=fork())==-1);的意思是:
调用fork()函数,将返回值交给p1,然后判断p1是否等于-1;

看到这个我想到了,输入多个字符时吸收换行符的办法:
while((ch=getchar())!='\n');
  c语言调用函数while((p1=fork())==-1)的意思是:
  fork函数是在当前进程中新建立一个子进程,如果这个创建子进程失败,那么返回-1,这个实际是把创建进程的返回值和-1比较看看是否创建失败。
  因为是写在while语句里,那么当创建失败之后,如果在while里面没有break或者跳出,当while执行体执行结束后又会执行(p1=fork())==-1,等于不断重复创建子进程一直到创建成功为止。
  注意这里会返回两次,因为父进程创建子进程的时候复制了父进程的地址空间,那么父子进程地址空间的语句执行都在等待fork返回的那句话里。
  所以返回两次是父进程返回一个,返回的是子进程的ID,子进程返回一次,返回的是0.
  那么我们根据不同的返回值就可以分别写出我们想要的父子进程的逻辑。
p1=fork()失败的情况下会返回-1

while((p1=fork())==-1)中就是对失败的情况进行处理
fork函数是在当前进程中新建立一个子进程,如果这个创建子进程失败,那么返回-1,这个实际是把创建进程的返回值和-1比较看看是否创建失败。
因为是写在while语句里,那么当创建失败之后,如果在while里面没有break或者跳出,当while执行体执行结束后又会执行(p1=fork())==-1,等于不断重复创建子进程一直到创建成功为止。
注意这里会返回两次,因为父进程创建子进程的时候复制了父进程的地址空间,那么父子进程地址空间的语句执行都在等待fork返回的那句话里。
所以返回两次是父进程返回一个,返回的是子进程的ID,子进程返回一次,返回的是0.
那么我们根据不同的返回值就可以分别写出我们想要的父子进程的逻辑。

猜你喜欢

转载自blog.csdn.net/baidu_32239977/article/details/53456949