linux中C语言关于进程的创建

能不能帮忙解释一下这段代码中的一部分#include<stdio.h>#include<sys/types.h>#include<sys/wait.h>#include<... 能不能帮忙解释一下这段代码中的一部分
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<errno.h>
#include<math.h>
#include<unistd.h>
int main(int argc,char **argv)
{
pid_t child;
int status;
printf("This will demostrate how to get the child status\n");
if((child=fork())==-1)
{
printf("Fork Error:%s\n",strerror(errno));
exit(1);
}
else if(child==0)
{
int i=0;
printf("I am the child:%d\n",getpid());
for(i=0;i<1000000;i++);
i=5;
printf("I exit with%d\n",i);
exit(i);
}
/*请解释一下*/
while(((child=wait(&status))==-1)&(errno==EINTR));
/*请解释一下*/
if(child==-1)
{
printf("Wait Error:%s",strerror(errno));
}
else if(!status)
{
printf("Child %d terminated normally return status is zero\n",child);
}
else if(WIFEXITED(status))
{
printf("Child %d terminated normally return status is %d\n",child,WEXITSTATUS(status));
}
else if(WIFSIGNALED(status))
{
printf("Child %d terminated due to signal %d znot caught\n",child,WTERMSIG(status));
}
return 0;
}
展开
 我来答
睿尔科技嵌入式
2013-09-09 · TA获得超过127个赞
知道答主
回答量:67
采纳率:0%
帮助的人:53.1万
展开全部
/*请解释一下*/
while(((child=wait(&status))==-1)&(errno==EINTR));

这种的目的是父亲进程等待子进程结枯困束,并回收子进程的资源,将子进程的退出状码桐态存储在status中,同时,返回该子进程的pid。
如果wait函数返回-1表示wait函数被其它情况打断返回,并没有等待到子进程结束,而同时判断errno的值是不是EINTR(意思是让你try again),那么,让进程继续等待。因为这个错误并不是真正wait错误,而是被timeout时间等造成的,因此重新等待。而如果是其它情况,显然是wait函数调用错误,即迟败坦下面的if(child==-1),需要打印错误信息。‘

//但你这句应该写错了。应该是逻辑与而不是位与操作。即
while(((child=wait(&status))==-1)&&(errno==EINTR));
/*请解释一下*/
if(child==-1)

你对信号处理部分还需要努力。
另外介绍一本书《Linux高级程序设计 第3版》 上面讲得很清楚。
有问题我们继续交流,一起学习。

更多技术文章可以关注我的微博,名字:成都睿尔科技 。
tattackor
2015-10-30 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:885万
展开全部

1、fork 是用来创建子进程的, 而不是线程( 线程创顷世链建需要用到 pthread_create )。
需要根据返渗 fork() 的返回值来判断下面的代码是在父进程(返回pid>0)中还是子进程(返回0)中. 像上面的代码中 if 中的代码被在子进程中执行, else 中的代码在父进程中执行。

2、例程:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
pid_t id;    //定义一个进程号变量
int i=0;
printf("start fork/n");
id = fork();    //调用fork函数新建一个进程
i ++;
printf("end fork/n");
//判断当前进程
if(id < 0){    //出错
perror("fork failed/n");
exit(1);
}
else if(id == 0){    //子进程
printf("In child/n");
printf("i = %d/n", i++);
exit(0);
}
else{    //父进程
printf("In father/n");
printf("i = %d/n"雀孙, i++);
exit(0);
}
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
北极没有雪
2013-09-09 · 超过22用户采纳过TA的回答
知道答主
回答量:91
采纳率:0%
帮助的人:64.7万
展开全部
父进程调用完子进程后,调用wait阻塞自己 ,等待子进程执行完毕再执行之后的操作。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
777e21945e3f
2013-09-08 · TA获得超过3280个赞
知道小有建树答主
回答量:941
采纳率:100%
帮助的人:1198万
展开全部
这根信号有关系。父进程调用wait会阻塞 自己,直到子进程退出。
例外是父进程阻罩档差塞过程中收到信号,比如收到一个CTRL-C组合键, 或是收到一个Kill信号等,这时父进程退出阻塞,去执行自己的蠢团信号处理程序。执行之后如果程序没有退出,就会到达这里的while语句。wait返回-1,物皮 errno=EINTR. 因为等待的条件没发生, 所以遇到这个条件, 程序重新执行wait.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式