Unix/linux 编程实践教程 ---------- 服务器-客户端编程
来源:互联网 发布:山东软件协会 编辑:程序博客网 时间:2024/06/05 09:17
一个简单到服务器可以写成这个样子:
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;elsebreak;}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表示如果没有僵尸进程则不必等待。
0 0
- Unix/linux 编程实践教程 ---------- 服务器-客户端编程
- Unix/Linux编程实践教程
- Unix/Linux编程实践教程
- Unix-linux编程实践教程
- unix/linux编程实践教程:服务器与socket
- 《unix/linux编程实践教程》之管道
- unix/linux编程实践教程--more命令
- unix/linux编程实践教程:who命令
- unix/linux编程实践教程:ls命令
- unix/linux编程实践教程:pwd命令
- unix/linux编程实践教程:学习stty
- unix/linux编程实践教程------学习笔记
- Unix/Linux编程实践教程 笔记一
- Unix/Linux编程实践教程–书评
- 《unix/linux编程实践教程》之Shell编程一
- 《unix/linux编程实践教程》之Shell编程二
- unix/linux编程实践教程:数据报编程
- 《unix/linux编程实践教程》学习笔记:第12章 编写web服务器
- 基于物联网的智能医护系统研究
- 杂乱知识点
- Java多态 向上转型 向下转型
- POJ 题目SPF(求割点,分成的连通块)
- 纷华与壮美
- Unix/linux 编程实践教程 ---------- 服务器-客户端编程
- while(scanf(“%d”, &n)!= EOF)
- Dev C++ 相关错误
- Oracle 技术杂记
- 指针函数与函数指针的区别
- JQuery中$.ajax()方法参数详解
- 关于读书
- Eclipse工具使用技巧总结
- spring mvc @Responsebody支持问题