Linux waitpid用WNOHANG
来源:互联网 发布:淘宝商品鞋子详情图片 编辑:程序博客网 时间:2024/05/30 12:03
waitpid的返回值比wait稍微复杂一些,一共有3种情况:
1. 当正常返回的时候,waitpid返回收集到的子进程的进程ID;
2. 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
3. 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid就会出错返回,这时errno被设置为ECHILD;
下面看一个简单的例子:
下载: waitpid.c
1. /* waitpid.c */
2. #include <sys/types.h>
3. #include <sys/wait.h>
4. #include <unistd.h>
5. #include <stdio.h>
6.
7. int main()
8. {
9. pid_t pc, pr;
10.
11. pc = fork();
12. if ( pc < 0 ) /* fork错误*/
13. {
14. printf("fork error\n");
15. exit(1);
16. }
17. else if ( pc == 0 ) /*在子进程中*/
18. {
19. sleep(10);
20. exit(0);
21. }
22. else
23. {
24. do {/* 使用了WNOHANG参数,waitpid不会在这里等待 */
25. pr = waitpid(pc, NULL, WNOHANG);
26. if ( pr == 0 )
27. {
28. printf("No child exit\n");
29. sleep(1);
30. }
31. }while (pr == 0 );
32. if ( pr == pc )
33. printf("successfully get child %d\n", pr);
34. else
35. printf("wait child error\n");
36. }
37. return 0;
38. }
编译并运行:
$ gcc -o waitpid waitpid.c
$ ./waitpid
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
successfully get child 4607
父进程经过10次失败的尝试之后,终于收集到了退出的子进程。父进程和子进程分别睡眠了10秒钟和1秒钟,代表它们分别作了10秒钟和1秒钟的工作。父子进程都有工作要做,父进程利用工作的简短间歇察看子进程的是否退出,如退出就收集它。
1. 当正常返回的时候,waitpid返回收集到的子进程的进程ID;
2. 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
3. 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
当pid所指示的子进程不存在,或此进程存在,但不是调用进程的子进程,waitpid就会出错返回,这时errno被设置为ECHILD;
下面看一个简单的例子:
下载: waitpid.c
1. /* waitpid.c */
2. #include <sys/types.h>
3. #include <sys/wait.h>
4. #include <unistd.h>
5. #include <stdio.h>
6.
7. int main()
8. {
9. pid_t pc, pr;
10.
11. pc = fork();
12. if ( pc < 0 ) /* fork错误*/
13. {
14. printf("fork error\n");
15. exit(1);
16. }
17. else if ( pc == 0 ) /*在子进程中*/
18. {
19. sleep(10);
20. exit(0);
21. }
22. else
23. {
24. do {/* 使用了WNOHANG参数,waitpid不会在这里等待 */
25. pr = waitpid(pc, NULL, WNOHANG);
26. if ( pr == 0 )
27. {
28. printf("No child exit\n");
29. sleep(1);
30. }
31. }while (pr == 0 );
32. if ( pr == pc )
33. printf("successfully get child %d\n", pr);
34. else
35. printf("wait child error\n");
36. }
37. return 0;
38. }
编译并运行:
$ gcc -o waitpid waitpid.c
$ ./waitpid
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
No child exit
successfully get child 4607
父进程经过10次失败的尝试之后,终于收集到了退出的子进程。父进程和子进程分别睡眠了10秒钟和1秒钟,代表它们分别作了10秒钟和1秒钟的工作。父子进程都有工作要做,父进程利用工作的简短间歇察看子进程的是否退出,如退出就收集它。
0 0
- Linux waitpid用WNOHANG
- waitpid WNOHANG
- waitpid WNOHANG WUNTRACED WCONTINUED
- 关于waitpid()中的WNOHANG
- wait waitpid WNOHANG 僵尸进程
- perl fork() $pid = waitpid(-1, WNOHANG
- Linux waitpid
- linux : waitpid函数
- linux waitpid wait (转)
- linux中的waitpid函数
- linux的waitpid函数
- Linux wait/waitpid详解
- linux中waitpid系统调用
- linux中waitpid系统调用
- linux中waitpid系统调用
- linux中waitpid系统调用
- linux中waitpid系统调用
- linux中waitpid系统调用
- CopyOnWriteArrayList(1)
- 移动终端web开发必备知识
- mysql联合索引经典实例与解析
- 关于"栈"对象弱引用的线程安全问题
- android四种数据存储及示例
- Linux waitpid用WNOHANG
- Hibernate 对象的三种状态
- IE6/IE7下margin-top失效解决方法
- srilm的安装
- 关于Java的10个谎言
- NoClassDefFoundError: io/vov/vitamio/LibsChecker
- 修改EditText中hint的字体大小
- How to get started with WebRTC
- 当你对未来迷茫的时候,请打开这个锦