Linux进程中 while((pid1=fork())==-1);if(pid1==0) {对该进程处理并exit后} else { } 先后执行if-else?

作者&投稿:孙宁 (若有异议请与网页底部的电邮联系)
if((pid1=fork())<0)和if(pid1=fork()<0)有什么区别么?!因为在Linux下这两个条件运行出的结果完全不同~

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的处理,那么,处理结果大相径庭,就不难理解了啊。

你不是 fork 出了两个子进程吗.
进程的执行顺序没有办法确定.
出现这种结果非常正常啊.

这个时候已经变成两个进程了,如果在终端ps会发现两个名字一样的进程。
如果能新建一个文件就能看出来了。如果那个进程能正确新建一个文件就说明进程已经启动成功。
当然,每一进程都是按照c语言规则执行代码程序,不会像你说的那样诡异的跳回上一个if语句。

很简单,打印父进程pid,然后创建子进程,并打印子进程pid,然后再创建一个子进程,并打印pid。\r\n\r\n#include <stdio.h>\r\n#include <unistd.h>\r\n#include <stdlib.h>\r\n\r\nint main()\r\n{\r\n int pid1, pid2;\r\n\r\n printf("Parent's PID is %d\n", getpid());\r\n\r\n pid1 = fork();\r\n\r\n if (pid1 == 0)\r\n {\r\n printf("Child1's PID is %d\n", getpid());\r\n exit(0);\r\n }\r\n else if(pid1 < 0)\r\n {\r\n printf("fork error!\n");\r\n exit(1);\r\n }\r\n\r\n wait(NULL);\r\n printf("Child1 (PID=%d) already exit\n", pid1);\r\n\r\n pid2 = fork();\r\n\r\n if (pid2 == 0)\r\n {\r\n printf("Child2's PID is %d\n", getpid());\r\n exit(0);\r\n }\r\n else if(pid2 < 0)\r\n {\r\n printf("fork error!\n");\r\n exit(1);\r\n }\r\n\r\n wait(NULL);\r\n printf("Child2 (PID=%d) already exit\n", pid2);\r\n\r\n return 0;\r\n}


隆阳区15894958683: Linux进程中 while((pid1=fork())== - 1);if(pid1==0) {对该进程处理并exit后} else { } 先后执行if - else? -
频姿依托: 这个时候已经变成两个进程了,如果在终端ps会发现两个名字一样的进程. 如果能新建一个文件就能看出来了.如果那个进程能正确新建一个文件就说明进程已经启动成功. 当然,每一进程都是按照c语言规则执行代码程序,不会像你说的那样诡异的跳回上一个if语句.

隆阳区15894958683: 我在LINUX中运行进程通信实验,结果一直报错:parse error before '==' token ,这是怎么回事 -
频姿依托: 不贴源码,天知道这是怎么回事 无语了,都提示到是这一行出错了,你自己数数看括号是否匹配啊…… 竟然能扯到编译环境和头文件上去…… while(p1=fork())==-1); 改成 while((p1=fork())==-1);

隆阳区15894958683: 在linux环境下c语言中如何让while循环执行固定的时间如200毫秒 -
频姿依托: ...楼上的想让你的程序变成悲剧...linux下sleep函数的参数是秒为单位的...休眠200秒...睡眠小于1秒用usleep,单位是毫秒...所以,楼上的程序把sleep改成usleep就可以 了...while(1) {/* any thing you want to do*/ usleep(200); } 另外我觉得你要说的...

隆阳区15894958683: 急急!Linux 命令框里 将文件导入程序的问题 -
频姿依托: 我实验了下, <和>这两个个符号,没有作为单独的参数处理,因为在作为参数传递给程序之前,已经提前被shell给解析并替换了.简单的例子:#include <stdio.h>#include <stdlib.h> int main(int argc ,char *argv[]) { printf("arguement0=%s\...

隆阳区15894958683: linux进程中断处理的问题 -
频姿依托: fork()用来创建一个子进程,如果创建失败,则返回-1;如果成功,则返回进程的进程号;while((pid1=for())==-1);的意思就是不断尝试创建子进程,直至成功.

隆阳区15894958683: linux 获取进程id 函数?? -
频姿依托: linux C中,获取当前进程id 函数为getpid() ; 头文件:#include <unistd.h>函数原型:pid_t getpid(void);函数说明:getpid ()用来取得目前进程的进程id,许多程序利用取到的此值来建立临时文件, 以避免临时文件相同带来的问题.返回值:目前进程的进程id范例 #include <stdio.h> #include <unistd.h> main() {printf("pid=%d\n", getpid()); }执行: pid=1494 /*每次执行结果都不一定相同 */

隆阳区15894958683: linux中cp命令如何用 C语言实现 -
频姿依托: 1,首先需要了解cp的原理. 2,可以参考cp的源码去了解其原理 3,cp命令的源码可以在linux内核中找到. 4,或者下载busybox其中也会有cp的源码 只有了解其原理之后才能谈如何实现.参考代码如下: #include <stdio.h> #include <stdlib.h> ...

隆阳区15894958683: linux 下用while语句创建多用户 -
频姿依托: #!/bin/bash read -p "Please enter your name:" NAM while :douseradd $NAM && echo "$NAM is created successed." done

隆阳区15894958683: linux中C语言关于进程的创建 -
频姿依托: /*请解释一下*/ while(((child=wait(&status))==-1)&(errno==EINTR)); 这种的目的是父亲进程等待子进程结束,并回收子进程的资源,将子进程的退出状态存储在status中,同时,返回该子进程的pid.如果wait函数返回-1表示wait函数被其它情况打...

隆阳区15894958683: 在linux中一个进程怎样生出一个子进程啊 ,请各位高手指教
频姿依托: 两进程的程序,父进程循环显示parent,子进程循环显示child.#include main() { int pid,i; while((pid=fork())==-1); if(pid!=0) { while(1) { for(i=0;i<20;i++); printf("parent"); } } else { while(1) { for(i=0;i<20;i++); printf("child"); } } }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网