对于刚接触Linux网络编程的开发者来说,如何让服务器同时处理多个客户端请求是一个关键问题。本文将详细介绍Linux下使用多进程模型实现并发服务器的架构设计,通过fork()系统调用创建子进程来响应每个客户端连接,从而实现实时响应。关键词:多进程模型、并发服务器。
如果服务器只能一次处理一个客户端,其他客户端必须等待,导致响应延迟。多进程模型通过为每个客户端创建独立进程,实现真正的同时处理。
父进程负责监听端口,当accept返回新的客户端fd后,fork()一个子进程,子进程复制父进程的地址空间,并持有客户端fd,然后子进程处理该客户端的读写,父进程继续等待新连接。这样每个客户端都由独立进程服务。
但需要注意避免僵尸进程,使用signal(SIGCHLD, SIG_IGN)或注册信号处理函数回收子进程。
下面是一个完整的echo服务器示例,它接受客户端连接并回显数据。
#include #include #include #include #include #include #include #include #define PORT 8888#define BACKLOG 10void sigchld_handler(int sig) { while (waitpid(-1, NULL, WNOHANG) > 0);}int main() { int listen_fd, client_fd; struct sockaddr_in server_addr, client_addr; socklen_t client_len; pid_t pid; // 创建socket listen_fd = socket(AF_INET, SOCK_STREAM, 0); if (listen_fd < 0) { perror("socket"); exit(1); } // 设置端口复用 int opt = 1; setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); // 绑定 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(PORT); if (bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { perror("bind"); exit(1); } // 监听 if (listen(listen_fd, BACKLOG) < 0) { perror("listen"); exit(1); } // 信号处理,避免僵尸进程 signal(SIGCHLD, sigchld_handler); printf("Server listening on port %d", PORT); while (1) { client_len = sizeof(client_addr); client_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &client_len); if (client_fd < 0) { perror("accept"); continue; } pid = fork(); if (pid == 0) { // 子进程 close(listen_fd); // 子进程不需要监听fd char buffer[1024]; int n; while ((n = read(client_fd, buffer, sizeof(buffer)-1)) > 0) { buffer[n] = "�"; printf("Received: %s", buffer); write(client_fd, buffer, n); // echo back } close(client_fd); exit(0); } else if (pid > 0) { // 父进程 close(client_fd); // 父进程不需要客户端fd } else { perror("fork"); } } close(listen_fd); return 0;} 以上代码演示了多进程模型的基本框架。注意父进程关闭client_fd,因为子进程已经持有;子进程关闭listen_fd,避免干扰。信号处理函数sigchld_handler回收子进程资源,防止僵尸进程。
(1)进程间通信:虽然本例不需要,但复杂场景下可能需要进程间通信(如共享数据),可以使用管道、消息队列或共享内存。关键词:进程间通信。
(2)并发性能:多进程模型每个进程独立,稳定性高,但创建进程开销大,适合连接数不多但每个连接任务重的场景。
(3)实时响应:由于每个客户端有独立进程,不会相互阻塞,能快速响应。这是Linux网络编程的常用技巧。
使用gcc编译:gcc server.c -o server,运行./server,然后在另一终端使用telnet 127.0.0.1 8888连接,发送消息看是否回显。可以同时开启多个telnet窗口测试并发能力。
本文介绍了Linux下基于多进程模型的并发服务器设计,涵盖了socket编程、fork、信号处理等核心知识。多进程模型是Linux网络编程的基础,理解它有助于进一步学习多线程、I/O多路复用等高级技术。记住关键词:多进程模型、并发服务器、Linux网络编程、进程间通信,它们构成了Linux并发编程的基石。
—— 本教程旨在帮助小白快速上手Linux多进程并发服务器开发 ——
本文由主机测评网于2026-03-06发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20260329072.html