父进程在子进程后执行

getline 2010-01-21 03:36:30
刚看APUE里的多进程那里。 父进程和子进程的执行顺序是不确定的,我先让父进程在子进程执行完之后再执行,该如何做?

测试代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
pid_t pid = fork();
int status;

if (pid == -1)
printf("fork process error\n");
else if (pid == 0)
{
printf("I am a child process, my processId is:%d\n", getpid());
_exit(0);
}
else
{
pid_t wPid = waitpid(-1, &status, WNOHANG);
if (wPid > 0)
{
if (WIFEXITED(status))
{
if (WEXITSTATUS(status) == 0)
{
printf("I am a father process, my processId is:%d\n", getpid());
}
}
}
}

return 0;
}


发现怎么从2次开始执行的时候就只打印了子进程再没打印父进程那里了,为什么啊?
...全文
372 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinwei1984 2010-01-22
  • 打赏
  • 举报
回复
waitpid 可以
上锁应该也行 看看IPC机制
不知名小ITer 2010-01-21
  • 打赏
  • 举报
回复
设一个状态机..等父进程结束了修改状态机,然后子进程执行,否则一直阻塞...
getline 2010-01-21
  • 打赏
  • 举报
回复
楼上的是什么意思?能不能说明白点,在哪里设置了。。

o p t i o n s参数使我们能进一步控制w a i t p i d的操作。此参数或者是0,或者是表8 - 2中常数的逐
位或运算。
表8-2 waitpid的选择项常数
常数说明
W N O H A N G 若若由p i d指定的子进程并不立即可用,则w a i t p i d不阻塞,此时其返回值为0
W U N T R A C E D 若若某实现支持作业控制,则由p i d指定的任一子进程状态已暂停,且其状态自暂
停以来还未报告过,则返回其状态。W I F S TO P P E D宏确定返回值是否对应于一个暂
停子进程
S V R 4支持两个附加的非标准的o p t i o n s常数。W N O WA I T使系统将其终止状态
已由w a i t p i d返回的进程保持在等待状态,于是该进程就可被再次等待。对于
W C O N T I N U E D,返回由p i d指定的某一子进程的状态,该子进程已被继续,其状
态尚未报告过。
w a i t p i d函数提供了w a i t函数没有提供的三个功能:
(1) waitpid等待一个特定的进程(而w a i t则返回任一终止子进程的状态)。在讨论p o p e n函数
时会再说明这一功能。
(2) waitpid提供了一个w a i t的非阻塞版本。有时希望取得一个子进程的状态,但不想阻塞。
(3) waitpid支持作业控制(以W U N T R A C E D选择项)。
Wind_Runner 2010-01-21
  • 打赏
  • 举报
回复
用waitpid并且阻塞式等待子进程退出思路是对的,
不过楼主没有设定为阻塞式的

sicxun 2010-01-21
  • 打赏
  • 举报
回复
WNOHANG是立即返回的
所以子进程可能没结束
跳过 了if (wPid > 0)
。。。
waitpid(-1, &status, NULL);

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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