中易网

c语言调用函数while((p1=fork())==-1)是什么意思

答案:8  悬赏:80  
解决时间 2021-01-12 17:44
c语言调用函数while((p1=fork())==-1)是什么意思
最佳答案
c语言调用函数while((p1=fork())==-1)的意思是:
  fork函数是在当前进程中新建立一个子进程,如果这个创建子进程失败,那么返回-1,这个实际是把创建进程的返回值和-1比较看看是否创建失败。
  因为是写在while语句里,那么当创建失败之后,如果在while里面没有break或者跳出,当while执行体执行结束后又会执行(p1=fork())==-1,等于不断重复创建子进程一直到创建成功为止。
  注意这里会返回两次,因为父进程创建子进程的时候复制了父进程的地址空间,那么父子进程地址空间的语句执行都在等待fork返回的那句话里。
  所以返回两次是父进程返回一个,返回的是子进程的ID,子进程返回一次,返回的是0.
  那么我们根据不同的返回值就可以分别写出我们想要的父子进程的逻辑。
全部回答
fork是创建进程的系统API,p1=fork())==-1 是创建子进程,并将id赋给p1,然后通过p1和-1比较判断子进程是否创建成功。追问if(p1!=0)
{
.......
}
else putchar('a');
说是父进程就输出a,怎么回事呢?
fork函数是在当前进程中新建立一个子进程,如果这个创建子进程失败,那么返回-1,这个实际是把创建进程的返回值和-1比较看看是否创建失败。
因为是写在while语句里,那么当创建失败之后,如果在while里面没有break或者跳出,当while执行体执行结束后又会执行(p1=fork())==-1,等于不断重复创建子进程一直到创建成功为止。
注意这里会返回两次,因为父进程创建子进程的时候复制了父进程的地址空间,那么父子进程地址空间的语句执行都在等待fork返回的那句话里。
所以返回两次是父进程返回一个,返回的是子进程的ID,子进程返回一次,返回的是0.
那么我们根据不同的返回值就可以分别写出我们想要的父子进程的逻辑。

#include
#include

#include
int main()
{
int p = -1;
while ( (p = fork()) == -1 )
{
std::cout << "create process failed!" << std::endl;
}
if (p == 0)
{
std::cout << "this is in the child process!" << std::endl;
}
esle
{
std::cout << "this is in the father process!" << std::endl;
}
}追问if(p1!=0)
{
.......
}
else putchar('a');
说是父进程就输出a,怎么回事呢?
p1=fork()失败的情况下会返回-1
while((p1=fork())==-1)中就是对失败的情况进行处理追问好的,可以解释下补充里的那个函数吗?
fork()应该是一个不带参数,返回一个int型数据的函数吧,
while((p1=fork())==-1);的意思是:
调用fork()函数,将返回值交给p1,然后判断p1是否等于-1;

看到这个我想到了,输入多个字符时吸收换行符的办法:
while((ch=getchar())!='\n');
赋值语句p1=fork()和循环语句while(p1==-1)的复合写法
fork函数的返回值赋值给p1,并判断p1是否等于-1,如果等于,则继续执行循环体;否则退出循环追问好的,可以解释下补充里的那个函数吗?追答我也不知道你的fork是怎么个函数啊。
fork可以获取其他线程的状态?或是类似getchar这样的输入函数?追问还是谢谢了

(p1=fork())==-1
分解为2步:
p1=fork()   
p1==-1
这么分解,应该清楚了吧?
sgainhsu的回答就挺好的。
下面是man fork的描述:
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 inherited.追问if(p1!=0)
{
.......
}
else putchar('a');
说是父进程就输出a,怎么回事呢?追答我们一步步分析这段程序。
int p1, p2;
while((p1 = fork()) == -1)
;
上面意思是成功创建一个子进程,不成功则进入死循环。
我们假设父进程为A,创建好的子进程为B。
if (p1 == 0) //不应该是 if (p1 != 0),这跟你说的"说是父进程就输出a,子进程就输出b和c,无法理解啊"有出入。
{
while((p2 = fork()) == -1)
;
if (p2 == 0)
putchar('b');
else
putchar('c');
}
else
putchar('a');
因为有两个进程,我们分开讨论。
1、在父进程A中,p1等于创建的子进程B的PID,不等于0。所以进入else分支里面。并输出a
2、在子进程B中,根据man fork中的描述,p1等于0。进入if分支里面。
在if分支里面,
while((p2 = fork()) == -1)
;
又创建一个新的子进程,我们假设为C。
这时重复上面的意思。
子进程B中的p2等于新的子进程C的PID,不等于0。进入else中,输出c。
而新子进程C中的p2等于0。进入if分支中,输出b。
至此,整个程序结束。
个人愚见,希望大家批评指正,互相学习。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
为人勿丧大义的上联
,他已婚,我们是同事,我深深爱上他了,他和
天神互动工作环境如何,怎么样
技术宅们,帮我仿照图片做个文档,能打印的。
9个队伍打球,需要打多少场
60,已生无有生,未生亦无生,离已生未生,生时即
求小乔被用刑的故事
绿源电动车相同的车型的轮毂编号都一样吗
目匠眼镜店地址好找么,我有些事要过去
我老公五十了,分开几天后一天做两次爱这是爱
佛家和道家做道场的时候,那个铃铛应该叫什么
沙盒堡垒战争种族解锁要求是什么
修养很高的人优秀吗
中国邮政储蓄银行(富民路营业所)(富民路138号
dnf为什么不刷出妖刀村正,我从过年到现在扔
推荐资讯
身所奉饭者以十数的身是什么意思?
负一乘二分之一等于负一加二分之一,负二分之
猴山上,一只猴子在(),一只猴在(),另一只猴子
怎样查银行卡有没有被注销
标志是“X”的汽车叫什么名字
中公面试班好还是京佳面试班好
如何操作登录淘宝授权快递助手使用方法
有关文学的诗歌
锡林郭勒银监分局地址好找么,我有些事要过去
帅子汽车维修地址在哪,我要去那里办事
广东农垦茂名技工学校怎么样?
请问这几个划线词什么意思
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?