UNIX网络编程卷1 服务器程序设计范式2 预先派生子进程,每个子进程调用accept
2014-08-25 21:56
274 查看
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
1.预先派生子进程:在启动阶段预先派生一定数量的子进程,当各个客户连接到达时,
这些子进程立即就能为它们服务。
2.优点是无须引入你进程执行 fork 的开销就能处理新到的客户。
缺点是父进程必须在服务器启动阶段猜测需要预先派生多少子进程。
3.父进程可以持续监视闲置子进程数,一旦该值降至低于某个阈值就派生额外的子进程,
一旦超另一个阈值就终止一些过剩的子进程。
4.如果有多个进程阻塞在引用同一个实体的描述符上,那么最好直接阻塞在诸如 accept 之类的函数而不是 select 之中。
1.预先派生子进程:在启动阶段预先派生一定数量的子进程,当各个客户连接到达时,
这些子进程立即就能为它们服务。
2.优点是无须引入你进程执行 fork 的开销就能处理新到的客户。
缺点是父进程必须在服务器启动阶段猜测需要预先派生多少子进程。
3.父进程可以持续监视闲置子进程数,一旦该值降至低于某个阈值就派生额外的子进程,
一旦超另一个阈值就终止一些过剩的子进程。
4.如果有多个进程阻塞在引用同一个实体的描述符上,那么最好直接阻塞在诸如 accept 之类的函数而不是 select 之中。
/* include serv02 */ #include "unp.h" static int nchildren; static pid_t *pids; int main(int argc, char **argv) { int listenfd, i; socklen_t addrlen; void sig_int(int); pid_t child_make(int, int, int); //0.创建监听套接字 if (argc == 3) listenfd = Tcp_listen(NULL, argv[1], &addrlen); else if (argc == 4) listenfd = Tcp_listen(argv[1], argv[2], &addrlen); else err_quit("usage: serv02 [ <host> ] <port#> <#children>"); //1.增设一个命令行参数供用户指定预先派生的子进程个数。 //分配一个存放各个子进程 ID 的数组,用于在父进程即将终止时由 main 函数终止所有子进程 nchildren = atoi(argv[argc-1]); pids = Calloc(nchildren, sizeof(pid_t)); //2.调用 child_make 创建各个子进程 for (i = 0; i < nchildren; i++) pids[i] = child_make(i, listenfd, addrlen); /* parent returns */ //3.设置中断信号 SIGINT 的处理函数 Signal(SIGINT, sig_int); //4.子进程负责处理所有事情。 --> ?? 为什么不直接 pause(),而要在 for 循环里 pause() for ( ; ; ) pause(); /* everything done by children */ } /* end serv02 */ // SIGINT 信号处理函数 /* include sigint */ void sig_int(int signo) { int i; void pr_cpu_time(void); //给每个子进程发送 SIGTERM 信号终止它们 for (i = 0; i < nchildren; i++) kill(pids[i], SIGTERM); //用 wait 回收所有子进程的资源 while (wait(NULL) > 0) /* wait for all children */ ; if (errno != ECHILD) err_sys("wait error"); //调用 pr_cpu_time 统计已终止子进程的资源利用统计 pr_cpu_time(); exit(0); } /* end sigint */ /* include child_make */ pid_t child_make(int i, int listenfd, int addrlen) { pid_t pid; void child_main(int, int, int); //调用 fork 派生子进程 if ( (pid = Fork()) > 0) return(pid); //父进程返回子进程的 pid 给 main 函数,回到 main 函数里的循环继续派生其它子进程 child_main(i, listenfd, addrlen); /* 子进程调用 child_main 函数,它是无限循环 */ } /* end child_make */
相关文章推荐
- UNIX网络编程卷1 服务器程序设计范式4 预先派生子进程,以线程互斥锁上锁方式保护accept
- UNIX网络编程卷1 服务器程序设计范式3 预先派生子进程,以文件上锁方式保护accept
- UNIX网络编程卷1 服务器程序设计范式5 预先派生子进程,由父进程向子进程传递套接字描述符
- UNIX网络编程卷1 服务器程序设计范式1 并发服务器,为每个客户请求fork一个进程
- UNIX网络编程卷1 服务器程序设计范式8 预先创建线程,由主线程调用accept
- UNIX网络编程卷1 服务器程序设计范式7 预先创建线程,以互斥锁上锁方式保护accept
- UNIX网络编程卷1 服务器程序设计范式6 并发服务器,为每个客户请求创建一个线程
- UNIX网络编程卷1 服务器程序设计范式0 迭代服务器
- TCP预先派生子进程服务程序,accept无上锁保护
- UNIX网络编程卷1 server程序设计范式8 预先创建线程,由主线程调用accept
- fork调用,父进程返回子进程的ID,子进程返回0,如果调用失败就返回负数
- UNIX网络编程卷1 回射服务器程序 TCP服务器程序设计范式 四个版本
- Windows批处理 调用程序后 不等待子进程 父进程继续执行命令
- UNIX网络编程卷1 server程序设计范式1 并发server,为每一个客户请求fork一个进程
- 父进程产生一系列子进程,每个子进程打印自己的PID然后退出。要求父进程最后打印PID。
- MultiProcess进程池的设计(三)主进程和子进程间的通信
- 预先派生子进程(preforking)
- 实验 9-1 1. 实现以下功能 a) 调用 pipe()创建无名管道 b) 调用 fork 创建一个子进程 c) 在子进程中向管道内写入 128k 数据,打印出进程号及成功写入的字节数 d) 在父
- TCP服务器设计范式 - 每个客户连接对应一个线程
- TCP服务器设计范式 - 每个客户连接对应一个线程