一个最简单的进程调用学习出现的问题

wan_j_zhang 2005-02-23 07:46:28
我的程序大致如下:
×××××××××××××××××××××××××××××××××××××××
void printnum()
{
int i;
for (i=0;i<2;i++)
printf("%d\n",i);
}

int main(int argc, char* argv[])
{

pid_t pid;
int status;

for(int i=0;i<2;i++)
{

if ((pid = fork())<0)
status=-1;
else if (0==pid)
{
system("./printnum");
_exit(127);
}
else
{

while (waitpid(pid,&status,WNOHANG)<0)
if (errno!=EINTR)
{
status=-1;
break;
}
}

}

return status;
}

×××××××××××××××××××××××××××××××××××××××
运行该程序testpid,为什么有时候的运行结果如下:
[root@SIG vincent]# ./testpid
0
1
[root@SIG vincent]# 0 (为什么正常输出的字符串跑到这里了???)
1
(为什么光标停留在此处????)

×××××××××××××××××××××××××××××××××××××××××××
有时候的运行结果如下:
[root@SIG vincent]# ./testpid
[root@SIG vincent]# 0 (为什么正常输出的字符串又跑到这里了???)
1
0
1
(为什么光标又停留在此处????)

真的很诡异。
...全文
71 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wan_j_zhang 2005-02-24
  • 打赏
  • 举报
回复
可是这样我新创建的进程就变成阻塞的了,我希望那几个新进程是非阻塞的并行运行,而不是阻塞的。请问,有没有别的办法啊?
gettext 2005-02-24
  • 打赏
  • 举报
回复
因为你用的是waitpid(pid,&status,WNOHANG);
你把WNOHANG去了试试。
waitpid(pid,&status,0)
ringerxyz 2005-02-24
  • 打赏
  • 举报
回复
“可是这样我新创建的进程就变成阻塞的了,”,进程为什么会阻塞呢?
-------------------------------
while (waitpid(pid,&status,WNOHANG)<0)
if (errno!=EINTR)
{
status=-1;
break;
}
这里是做什么用的?
-------------------------------
你程序的输出没什么大的问题,因为你的父进程返回后shell就以为你的程序结束了,所以就出现了提示符,
而此时你所创建的子进程并没有退出,
-------------------------------
不知道你究竟想实现什么样的功能?
下面的程序当子进程全部退出后父进程才退出,不知道符不符合你的要求
int main(int argc, char* argv[])
{

pid_t mypid[2];
int status;
int i=0;

for(;i<2;i++)
{
pid_t pid;
if ((pid = fork())<0)
{
status=-1;
}
else if (0==pid)
{
system("./b");
exit(1);
}
else
{
mypid[i]=pid;
}
}
waitpid(mypid[0],0,0);
waitpid(mypid[1],0,0);
printf("ok to exit\n");
return status;
}

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧