网络编程中wait与waitpid的区别
2010-11-10 22:03
225 查看
问题:
一个unp中第五章的例子:有5个客户端几乎同时向服务器发送终止连接,这时在服务器端将几乎同时产生SIGCHILD信号,然而信号在内核中是不排队的,信号处理函数只执行一次(我的理解是5个信号几乎同时到达,当第一个信号被处理时,其他4个信号是未决的,当信号处理函数处理完第一个到达的信号后,由于没有产生信号,信号处理函数将不会被再次调用)。那么在目前情况下,父进程怎样才能捕获到所有的子进程的退出状态呢?
分析:
在SIGCHLD的handler中添加如下代码显然不行:
void
sig_chld(int signo)
{
pid_t pid;
int stat;
pid = wait(&stat);
printf("child %d terminated/n", pid);
return;
}
因为使用wait时,它只等到第一个SIGCHLD到达的子进程,之后就如上所示return了。在信号处理函数只能执行一次的前提下,其他4个SIGCHLD信号就没有被处理。
而如果在handler中使用如下的方式就可以:
void
sig_chld(int signo)
{
pid_t pid;
int stat;
while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0)
printf("child %d terminated/n", pid);
return;
}
原因分析如下:在while循环中使用waitpid的非阻塞模式(WNOHANG),当第一个信号到达时,printf然后回到while继续waitpid,接着第二个信号到达,依次处理,直到这5个信号都被处理完之后,根据WNOHANG常量的说明“The waitpid function will not block if a child specified by pid is not immediately available. In this case, the return value is 0. ”(见APUE2中8.6节),所以waitpid将返回0,跳出while循环,这样子进程的终止状态都被捕获到了,父进程继续做它的事。
总结:
wait与waitpid的主要区别:
(1)waitpid能够等指定pid的子进程;而wait只能等第一个到达的子进程。
(2)waitpid通过指定WNOHANG可以不阻塞,没有可用的子进程就立即返回0;而wait要求父进程一直阻塞。
上面这两点其实就是waitpid比wait多了1、3两个参数。
补充:
查看源码,wait就是包装过的waitpid,include/unistd.h
static inline pid_t wait(int * wait_stat)
{
return waitpid(-1,wait_stat,0);
}
一个unp中第五章的例子:有5个客户端几乎同时向服务器发送终止连接,这时在服务器端将几乎同时产生SIGCHILD信号,然而信号在内核中是不排队的,信号处理函数只执行一次(我的理解是5个信号几乎同时到达,当第一个信号被处理时,其他4个信号是未决的,当信号处理函数处理完第一个到达的信号后,由于没有产生信号,信号处理函数将不会被再次调用)。那么在目前情况下,父进程怎样才能捕获到所有的子进程的退出状态呢?
分析:
在SIGCHLD的handler中添加如下代码显然不行:
void
sig_chld(int signo)
{
pid_t pid;
int stat;
pid = wait(&stat);
printf("child %d terminated/n", pid);
return;
}
因为使用wait时,它只等到第一个SIGCHLD到达的子进程,之后就如上所示return了。在信号处理函数只能执行一次的前提下,其他4个SIGCHLD信号就没有被处理。
而如果在handler中使用如下的方式就可以:
void
sig_chld(int signo)
{
pid_t pid;
int stat;
while ( (pid = waitpid(-1, &stat, WNOHANG)) > 0)
printf("child %d terminated/n", pid);
return;
}
原因分析如下:在while循环中使用waitpid的非阻塞模式(WNOHANG),当第一个信号到达时,printf然后回到while继续waitpid,接着第二个信号到达,依次处理,直到这5个信号都被处理完之后,根据WNOHANG常量的说明“The waitpid function will not block if a child specified by pid is not immediately available. In this case, the return value is 0. ”(见APUE2中8.6节),所以waitpid将返回0,跳出while循环,这样子进程的终止状态都被捕获到了,父进程继续做它的事。
总结:
wait与waitpid的主要区别:
(1)waitpid能够等指定pid的子进程;而wait只能等第一个到达的子进程。
(2)waitpid通过指定WNOHANG可以不阻塞,没有可用的子进程就立即返回0;而wait要求父进程一直阻塞。
上面这两点其实就是waitpid比wait多了1、3两个参数。
补充:
查看源码,wait就是包装过的waitpid,include/unistd.h
static inline pid_t wait(int * wait_stat)
{
return waitpid(-1,wait_stat,0);
}
相关文章推荐
- 网络编程中wait与waitpid的区别
- 网络编程(12)—— 利用wait和waitpid函数消毁僵尸进程
- 网络编程(26)—— TIME_WAIT、FIN_WAIT1、FIN_WAIT2和CLOSE_WAIT状态的区别
- 网络编程中的wait和waitpid
- 网络编程中同步、异步、阻塞和非阻塞四种调用方式的区别
- Java_网络编程_UDP与TCP的区别
- TCP与UDP在socket编程中的区别 (网络收集转载)
- 网络编程(10)—— 通过设置可选项取消socket的TImeWait状态以及开启Nagle算法
- 并发编程学习笔记 三------- 关于在if中和while中使用wait(),唤醒之后的区别
- wait()和waitpid()函数的区别和SIGCHLD信号的关系
- 【java面试系列之网络编程】TCP和UDP的区别、TCP协议的三次握手和四次挥手、TCP协议的通信状态、网络编程时的同步、异步、阻塞、非阻塞、进程间的通信方式、TCP的流量控制和拥塞控制
- linux网络编程之socket(三):最简单的回射客户/服务器程序、time_wait 状态
- 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—实践篇
- linuxh中wait和waitpid 的区别
- 网络编程小知识——TIME_WAIT理解
- 深入浅出---unix多进程编程之wait()和waitpid()函数
- Linux 网络编程之TIME_WAIT状态
- 【Linux网络编程】无连接和面向连接协议的区别
- Winidow与Linux网络编程区别
- 网络通信中标志通信进程、TCP三次握手四次撒手、TCP与UDP在socket编程中的区别