永发信息网

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

答案:4  悬赏:80  手机版
解决时间 2021-02-02 18:21
linux中C语言关于进程的创建
最佳答案
1、fork 是用来创建子进程的, 而不是线程( 线程创建需要用到 pthread_create )。
需要根据 fork() 的返回值来判断下面的代码是在父进程(返回pid>0)中还是子进程(返回0)中. 像上面的代码中 if 中的代码被在子进程中执行, else 中的代码在父进程中执行。
2、例程:
#include 
#include 
#include 
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.

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版》 上面讲得很清楚。
有问题我们继续交流,一起学习。
更多技术文章可以关注我的微博,名字:成都睿尔科技 。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
幸福有约婚庆工作室地址好找么,我有些事要过
草原生态系统进行着能景流动、物质循环和信息
福轩茶庄地址在什么地方,想过去办事
红软盒美版万宝路 真假
伊爱婚礼高端定制地址有知道的么?有点事想过
柔范的意思是什么啊?知道的请说下!
TP-LINK双频无线路由器在电脑上只显示了一个
旭彤保健食品店团结西路店在什么地方啊,我要
黄河母亲由来有没有故事
价值是1099元,可以作为固定资产吗
报站的意思是什么啊?知道的请说下!
龙里地址在哪,我要去那里办事
为什么同一种烟 一包好吸一包不好吸
成年人户口簿改名需要多久?
当小明到了爸爸现在的年龄时,爸爸到了爷爷现
推荐资讯
港澳证签注是团体旅游(l)续签可以续签个人旅
抄答案被妈妈发现了怎么向妈妈认错
米美容美体地址有知道的么?有点事想过去
某糖果企业为了调查糖果更换包装的效果,选取
天生祥超市江城店在什么地方啊,我要过去处理
写工的意思是什么啊?知道的请说下!
恒羽.佛雷斯球馆地址在什么地方,想过去办事
请问宝马3系一个月各方面费用大概需要多少钱
瑞鹏宠物医院景田分院怎么去啊,有知道地址的
回星的意思是什么啊?知道的请说下!
怎么向鹤城晚报投稿啊
中国邮政售票点在什么地方啊,我要过去处理事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?