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;
} 展开
#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;
} 展开
4个回答
展开全部
/*请解释一下*/
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版》 上面讲得很清楚。
有问题我们继续交流,一起学习。
更多技术文章可以关注我的微博,名字:成都睿尔科技 。
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、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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
父进程调用完子进程后,调用wait阻塞自己 ,等待子进程执行完毕再执行之后的操作。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这根信号有关系。父进程调用wait会阻塞 自己,直到子进程退出。
例外是父进程阻罩档差塞过程中收到信号,比如收到一个CTRL-C组合键, 或是收到一个Kill信号等,这时父进程退出阻塞,去执行自己的蠢团信号处理程序。执行之后如果程序没有退出,就会到达这里的while语句。wait返回-1,物皮 errno=EINTR. 因为等待的条件没发生, 所以遇到这个条件, 程序重新执行wait.
例外是父进程阻罩档差塞过程中收到信号,比如收到一个CTRL-C组合键, 或是收到一个Kill信号等,这时父进程退出阻塞,去执行自己的蠢团信号处理程序。执行之后如果程序没有退出,就会到达这里的while语句。wait返回-1,物皮 errno=EINTR. 因为等待的条件没发生, 所以遇到这个条件, 程序重新执行wait.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询