Chinaunix首页 | 论坛 | 博客
  • 博客访问: 484265
  • 博文数量: 53
  • 博客积分: 492
  • 博客等级: 下士
  • 技术积分: 866
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-14 15:12
文章分类

全部博文(53)

文章存档

2016年(1)

2015年(3)

2014年(17)

2013年(9)

2012年(7)

2011年(16)

我的朋友

分类: LINUX

2011-11-14 15:25:41

刚写个demo程序验证了一下,waitpid是会阻塞的,当然它可以设置成非阻塞模式,通过设置WNOHANG选项。


    我的demo程序的思路是这样的,主进程fork两个子进程,第二个子进程延迟1s结束,主进程调用两个waitpid,先等待子进程2,再等待子进程1 。

    测试结果,子进程2结束后第一个waitpid才会返回。


#include
#include
#include
int main()
{
    pid_t pid;
    int i;
    int id[2];
    for(i = 0; i < 2; ++i)
    {

        pid = fork();
        if(pid == 0)
        {
            printf("child process!\n");
            if(i == 1)
            {
                sleep(1);
                printf("sleep 1\n");
            }
            exit(0);
        }
        else
        {
            printf("parent process!\n");
        }
        id[i] = pid;
    }
    for(i = 0; i < 2; ++i)
    {
        printf("child%d:%d\n", i, id[i]);
    }
    printf("first wait!\n");
    pid = waitpid(id[1], NULL, 0);
    printf("pid:%d\n", pid);
    printf("second wait!\n");
    pid = waitpid(id[0], NULL, 0);
    printf("pid:%d\n", pid);

    sleep(2);
    printf("return!\n");
    return 0;
}



运行结果:

parent process!
child process!
parent process!
child process!
child0:28945
child1:28946
first wait!
sleep 1
pid:28946  //说明子进程2先结束,waitpid才返回
second wait!
pid:28945
return!
阅读(4911) | 评论(1) | 转发(0) |
0

上一篇:没有了

下一篇:获取IP数据包中的ICMP段

给主人留下些什么吧!~~

temp_spot2013-02-03 12:43:46

waitpid在没有使用选项的情况下的确会阻塞,但我觉得你的程序好像有些问题。因为毕竟你输出的顺序是决定的,所以实际上你无法知道内核是否先返回的是第2个进程,也许在你执行pid=waitpid()这条语句的时候,就已经把pid的一个副本存进了内存,当需要打印出来的时候,系统只是把这个副本的值按照你程序的顺序打印了出来。如果不信,你可以试试把第一个子进程和第二个子进程输出的代码顺序交换一下,你会发现又是第一个子进程先返回的pid。