if((pid1=fork())<0)和if(pid1=fork()<0)有什么区别么?!因为在Linux下这两个条件运行出的结果完全不同
发布网友
发布时间:2022-06-15 09:14
我来回答
共4个回答
热心网友
时间:2023-11-15 09:16
C语言中的运算符是有优先级的。
赋值运算符“=”的级别最低。
fork()函数的返回值有三种情形:
负数:如果出错,则fork()返回-1,此时没有创建新的进程。最初的进程仍然运行。
零:在子进程中,fork()返回0
正数:在负进程中,fork()返回正的子进程的PID
if((pid1=fork())<0)的意思是:执行fork()创建进程,并把返回值赋给pid1;
(1)如果fork()返回负数,也就是创建进程失败,则表达式((pid1=fork())<0)为真,pid = -1,从而会执行后面的语句;
(2)如果返回值为正数或者0,也就是进程创建成功,pid1 >= 0,则不执行后边的语句。
if(pid1=fork()<0)的意思是:执行fork()创建进程,把逻辑表达式fork()<0的值赋给pid1,
(1)如果它的返回值为负数,也就是创建进程失败,则表达式(pid1=fork()<0)为真,pid1 = 1,从而会执行后面的语句;(在if语句中,应该不会直接用pid1作处理的,但else语句中,一般会对pid1进行判断,子进程和父进程分别进行不同的操作,但pid1已经不表示子进程号,从而出错。)
(2)如果fork()返回值为正数或者0,那么表达式为假,pid1 = 0,从而不会执行后边的语句。(此时,情况同上面讲的else分支的情况,即从逻辑上看认为已经创建子进程成功了,而pid1却不是表示子进程号,而是0,从而代码出现错误)
从上面的分析可以看出:
(1)fork()执行成功,则无论是子进程还是父进程都会执行If后面的语句;如果fork()执行失败,则原有进程都不会执行if后面的语句。所以,从逻辑分支的选择上看,二者是等效的。
(2)但pid1 的赋值不同。如果if后面的语句或者else后面的语句中,涉及到对pid1的处理,那么,处理结果大相径庭,就不难理解了啊。
热心网友
时间:2023-11-15 09:16
等于号的优先级比小于号的要低。先执行<,再执行=.
热心网友
时间:2023-11-15 09:17
运算符有一个优先顺序。。=与<。。所以运算的结果也就不一样了。
热心网友
时间:2023-11-15 09:18
括号影响了,运算的优先级。所以结果不同。追问能解释得具体一点么,谢谢~
是不是区别在于,有括号,先执行了创建子进程,然后子进程把这句判断也复制过去了?
还是。。。。。
追答对,很明显。先执行括号内的。