- 服务器务必要对应多个客户端, 但是accept是一个阻塞函数, 所以根据需求, 主进程可以负责accept, 然后子进程对接受请求的文件描述符进行通信, 而不会影响主进程的accept.
- 注意: 1. 创建完子进程之后, 共享文件描述符, 但是子进程对监听的文件描述符不需要, 所以关闭监听文件描述符. 2. 子进程资源的回收: 因为父进程在负责accept, 无法顾及子进程资源的回收, 这是一般通过信号来解决, 即在fork之前, 或者父进程里注册信号捕捉.但是在处理函数中使用的wait要使用循环来wait, 因为如果有多个进程同时需要回收, 但是信号是不支持排队, 所以需要循环回收
void func(int no) {
while(waitpid() > 0)
}
tcp多进程伪代码: 回头更新完整代码
int main {
// 创建监听的套接字
int lfd = socket()
// 绑定
bind(lfd, &sockaddr_in, len); // 监听
listen(lfd, 128);
// 注册信号捕捉
struct sigaction act; sigaction(SIGCHLD, &act, NULL);
while(1) {
// 阻塞等待连接请求 int cfd = accept();
// 创建子进程
pid_t pid = fork();
// 子进程 if(pid == 0) {
close(lfd);
// 通信 - 客户端
while(1)
{
// 接收数据 recv(cfd);
// 发送数据 send(cfd);
} }
} }
void func(int no) {
while(waitpid() > 0)
}