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

能不能帮忙解释一下这段代码中的一部分
#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;
}

/*请解释一下*/
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版》 上面讲得很清楚。
有问题我们继续交流,一起学习。

更多技术文章可以关注我的微博,名字:成都睿尔科技 。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-10-30

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;
}

第2个回答  2013-09-09
父进程调用完子进程后,调用wait阻塞自己 ,等待子进程执行完毕再执行之后的操作。
第3个回答  2013-09-08
这根信号有关系。父进程调用wait会阻塞 自己,直到子进程退出。
例外是父进程阻塞过程中收到信号,比如收到一个CTRL-C组合键, 或是收到一个Kill信号等,这时父进程退出阻塞,去执行自己的信号处理程序。执行之后如果程序没有退出,就会到达这里的while语句。wait返回-1, errno=EINTR. 因为等待的条件没发生, 所以遇到这个条件, 程序重新执行wait.
相似回答