Unix/linux 编程实践教程 ---------- 服务器-客户端编程
2015-03-09 21:36
633 查看
一个简单到服务器可以写成这个样子:
第一处:
为什么需要处理 accept 可能产生到 EINTR 错误呢, 因为这个errno可能是因为信号 SIGCHLD产生的,信号的产生会转到信号处理函数从而中断accept,从而导致accept返回-1,并设置 errno为 EINTR,如果不处理,就无法区分到底是真正到错误还是信号SIGCHLD的产生导致的-1的返回了。
第二处:
这是关于如何处理多个信号的。如果多个子进程几乎同时退出,将会如何呢?
假设同时有3个SIGCHLD发到父进程。最先到的信号导致父进程着手处理该信号,其余信号导致信号阻塞,但是并不缓存信号。从而第二个信号阻塞,而第三个信号丢失。此时,如果还有其他子进程退出,那这些信号也会丢失。
解决办法是调用wait足够多次来去除所有的终止进程,因此要用while 多次调用waitpid
waitpid第一个参数 -1 表示等待所有的子进程,第二个NULL表示子进程到状态,第三个WNOHANG表示如果没有僵尸进程则不必等待。
int main() { int sock,fd; void child_waiter(int),process_request(int); signal(SIGCHLD,child_waiter); if((sock=make_server_socket(PORTNUM)) == -1) err_deal("---"); while(1) { if(fd = accept(sock,NULL,NULL) == -1) { if(errno == EINTR) // 第一处 continue; else break; } process_request(fd); close(fd); } } void child_waiter(int s) { while(waitpid(-1,NULL,WNOHANG) > 0); //第二处 } void process_request(int fd) { --------- }
第一处:
为什么需要处理 accept 可能产生到 EINTR 错误呢, 因为这个errno可能是因为信号 SIGCHLD产生的,信号的产生会转到信号处理函数从而中断accept,从而导致accept返回-1,并设置 errno为 EINTR,如果不处理,就无法区分到底是真正到错误还是信号SIGCHLD的产生导致的-1的返回了。
第二处:
这是关于如何处理多个信号的。如果多个子进程几乎同时退出,将会如何呢?
假设同时有3个SIGCHLD发到父进程。最先到的信号导致父进程着手处理该信号,其余信号导致信号阻塞,但是并不缓存信号。从而第二个信号阻塞,而第三个信号丢失。此时,如果还有其他子进程退出,那这些信号也会丢失。
解决办法是调用wait足够多次来去除所有的终止进程,因此要用while 多次调用waitpid
waitpid第一个参数 -1 表示等待所有的子进程,第二个NULL表示子进程到状态,第三个WNOHANG表示如果没有僵尸进程则不必等待。
相关文章推荐
- Unix-Linux编程实践教程——第三章
- Unix-Linux编程实践教程——第七章
- UNIX-LINUX编程实践教程->第三章->实例代码注解->ls2
- UNIX-LINUX编程实践教程->第八章->实例代码注解->写一个简单的shell
- Unix/Linux 编程实践教程 第7章 笔记(1)
- Unix-Linux编程实践教程——第四章
- UNIX-LINUX编程实践教程->第二章->实例代码注解->more01
- UNIX-LINUX编程实践教程->第二章->实例代码注解->cp1
- 《Unix-Linux编程实践教程》读书笔记(一)
- Unix-Linux编程实践教程——第十二章
- 《Unix-Linux编程实践教程》读书笔记(四)
- 《Unix-Linux编程实践教程》读书笔记(三)
- Unix-Linux编程实践教程——第九章
- UNIX-LINUX编程实践教程->第三章->实例代码注解->ls1
- 【Unix/Linux编程实践】DIY简单web服务器
- Unix-Linux编程实践教程——第六章
- Unix-Linux编程实践教程——第八章
- 一句话读书之unix-linux编程实践教程
- UNIX-LINUX编程实践教程->第八章->实例代码注解->写一个简单的shell->在shell中启动另一个程序
- Unix/Linux 编程实践教程 第6章 笔记