中易网

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

答案:8  悬赏:80  
解决时间 2021-01-12 17:44
  • 提问者网友:战魂
  • 2021-01-11 22:31
c语言调用函数while((p1=fork())==-1)是什么意思
最佳答案
  • 二级知识专家网友:深街酒徒
  • 2021-01-11 23:17
c语言调用函数while((p1=fork())==-1)的意思是:
  fork函数是在当前进程中新建立一个子进程,如果这个创建子进程失败,那么返回-1,这个实际是把创建进程的返回值和-1比较看看是否创建失败。
  因为是写在while语句里,那么当创建失败之后,如果在while里面没有break或者跳出,当while执行体执行结束后又会执行(p1=fork())==-1,等于不断重复创建子进程一直到创建成功为止。
  注意这里会返回两次,因为父进程创建子进程的时候复制了父进程的地址空间,那么父子进程地址空间的语句执行都在等待fork返回的那句话里。
  所以返回两次是父进程返回一个,返回的是子进程的ID,子进程返回一次,返回的是0.
  那么我们根据不同的返回值就可以分别写出我们想要的父子进程的逻辑。
全部回答
  • 1楼网友:孤老序
  • 2021-01-12 06:23
fork是创建进程的系统API,p1=fork())==-1 是创建子进程,并将id赋给p1,然后通过p1和-1比较判断子进程是否创建成功。追问if(p1!=0)
{
.......
}
else putchar('a');
说是父进程就输出a,怎么回事呢?
  • 2楼网友:鱼芗
  • 2021-01-12 04:54
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,怎么回事呢?
  • 3楼网友:风格不统一
  • 2021-01-12 03:39
p1=fork()失败的情况下会返回-1
while((p1=fork())==-1)中就是对失败的情况进行处理追问好的,可以解释下补充里的那个函数吗?
  • 4楼网友:鸽屿
  • 2021-01-12 02:04
fork()应该是一个不带参数,返回一个int型数据的函数吧,
while((p1=fork())==-1);的意思是:
调用fork()函数,将返回值交给p1,然后判断p1是否等于-1;

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

(p1=fork())==-1
分解为2步:
p1=fork()   
p1==-1
这么分解,应该清楚了吧?
  • 7楼网友:思契十里
  • 2021-01-12 00:17
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。
至此,整个程序结束。
个人愚见,希望大家批评指正,互相学习。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息