免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4276 | 回复: 4
打印 上一主题 下一主题

[C] 关于waitpid函数返回值的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-03 16:03 |只看该作者 |倒序浏览
1        #include<sys/types.h>
     2        #include<sys/wait.h>
     3        #include<stdio.h>
     4        #include<stdlib.h>
     5        #include<signal.h>
     6       
     7        int main()
     8        {
     9                pid_t pid;
    10                int ret;
    11                int status;
    12                int ppid;
    13                if((pid=fork())<0)
    14                {
    15                        perror("进程创建失败!\n");
    16                        exit(0);
    17                }
    18                if(pid==0) /* 在子进程中  */
    19                {       
    20                        printf("子程序开始结束自身...\n");       
    21                        raise(SIGSTOP);  /*给自己发信号 */
    22                        printf("子程序已经结束自身!\n");       
    23                        exit(0);
    24                }
    25                else  /* 在父进程中  */
    26                {
    27                        printf("PID=%d\n",pid);
    28                        if((ppid=waitpid(pid,&status,WNOHANG)) == 0)
    29                        {
    30                                if((ret=kill(pid,SIGKILL)) == 0)
    31                                        printf("Kill PID=%d Status=%d ppid=%d\n",pid,status,ppid);                       
    32                        }
    33                        else
    34                        {
    35                                perror("Kill Error!\n");
    36                        }
    37                }
    38                return 0;
    39        }
程序的运行结果为:
  子程序开始结束自身...
  PID=28161
  Kill PID=28161 Status=-1078681508 ppid=0
请问程序的第28行waitpid(...)的返回值为什么为0,而不等于pid的值?根据库函数文档说,应返回pid的值呀?

论坛徽章:
0
2 [报告]
发表于 2008-07-03 16:28 |只看该作者
raise(SIGSTOP);  只是STOP在那儿,并没有真正结束,可以用SIGCONT让它继续执行
所以这句也没打印出来吧     printf("子程序已经结束自身!\n");     

The WNOHANG option is used to indicate that the call
should not block if there are no processes that wish to report status.

把WHOHANG去掉,或者raise(SIGSTOP);换成raise(SIGKILL);试试

论坛徽章:
0
3 [报告]
发表于 2008-07-04 02:18 |只看该作者

关于waitpid函数返回值的问题

本程序是一个多线程的程序,其运行结果具有不确定性,“子程序开始结束自身...”这一句有时是不能打印出来的。程序本身没有什么语法错误,我的问题就是程序的第28行waitpid(...)的返回值为什么为0,而不等于pid的值?请大家不吝赐教,谢谢大家。

[ 本帖最后由 handsomedtl 于 2008-7-4 12:40 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2008-07-04 09:38 |只看该作者
这和多线程无关吧? 或者是你笔误

By default, waitpid() waits  only  for  terminated  children,  but  this
behaviour is modifiable via the options argument, as described below.

WNOHANG
              return immediately if no child has exited.

WUNTRACED
              also return if a child has stopped

因为你用了WNOHANG,而不是WUNTRACED, 子进程只是stoped,而不是exited

论坛徽章:
0
5 [报告]
发表于 2008-07-04 15:38 |只看该作者
apue中

WNOHANG 若由pid指定的子进程并不是立即可用的,则waitpid不阻塞,此时其返回值为0
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP