社区
Linux/Unix社区
帖子详情
UNIX下多进程的服务器程序开发请教!高分相送!!!
sjmblue
2004-02-02 10:44:21
想编写一个UNIX下的多进程的服务器端程序,作为一个服务器后台运行,接受客户端的发来的数据包,是通过socket进行数据交互的!
原来的是个单进程的,现在想写成一个后台多进程的程序,并且能较好的处理僵尸进程,但感到无从下手,虽然知道如何fork,如何exec,想请教哪位能给个较好的例子或是相关资料或是相关经验,多谢多谢!!!
...全文
53
8
打赏
收藏
UNIX下多进程的服务器程序开发请教!高分相送!!!
想编写一个UNIX下的多进程的服务器端程序,作为一个服务器后台运行,接受客户端的发来的数据包,是通过socket进行数据交互的! 原来的是个单进程的,现在想写成一个后台多进程的程序,并且能较好的处理僵尸进程,但感到无从下手,虽然知道如何fork,如何exec,想请教哪位能给个较好的例子或是相关资料或是相关经验,多谢多谢!!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sjmblue
2004-02-03
打赏
举报
回复
多谢诸位,尤其是sunriselx() ,先好好研究 一下再来讨教!!!
xinyi
2004-02-03
打赏
举报
回复
多線程不好,程序一出錯,守護進程就沒了,還是多進程好
icesg
2004-02-02
打赏
举报
回复
you can use posix
yuanlei1978113
2004-02-02
打赏
举报
回复
我想你是用多线程配合select不是更好吗!注意在客户端断开连接后服务器最好关闭
与之连接socket。
passingguy
2004-02-02
打赏
举报
回复
要避免zombie,用sigaction函数
sunriselx
2004-02-02
打赏
举报
回复
手头刚好有个简单的例子,不太好,但基本能说明问题,里面没有做daemon的初始化,这种方式客户端不能太多,几百个就差不多了。
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <iostream>
#include <list>
#include <algorithm>
using std::list;
using std::cerr;
using std::endl;
int start_listen(unsigned long port)
{
int ls = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port);
if (bind(ls, (struct sockaddr *)&addr, sizeof(struct sockaddr)) != 0) {
close(ls);
return -1;
}
if (listen(ls, 2000) != 0) {
close(ls);
return -1;
}
return ls;
}
int get_client(int ls)
{
int ret = -1;
fd_set rSet;
FD_ZERO(&rSet);
FD_SET(ls, &rSet);
timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;
if (select(ls + 1, &rSet, 0, 0, &timeout) > 0
&& FD_ISSET(ls, &rSet)) {
sockaddr_in addr;
socklen_t len = sizeof(sockaddr);
errno = 0;
int cs = accept(ls, (sockaddr*)&addr, &len);
if (cs > 0) {
ret = cs;
} else {
perror("accept failed");
}
}
return ret;
}
void serve_client(int cs)
{
char buf[1024];
while (1) {
sleep(1);
// recv something from client
memset(buf, 0, sizeof(buf));
int len = recv(cs, buf, sizeof(buf), 0);
if (len < 0) {
cerr << "recv error" << endl;
break;
} else if (len == 0) {
cerr << "client close connection" << endl;
close(cs);
break;
}
// send data back
if (send(cs, buf, len, 0) != len) {
cerr << "send data back error" << endl;
break;
}
}
}
int main(int, char**)
{
int ls = start_listen(20000);
if (ls < 0) {
cerr << "listen failed" << endl;
return -1;
}
list<long> childs(0);
while (1) {
int cs = get_client(ls);
if (cs > 0) {
cerr << "got client : " << cs << endl;
pid_t pid= fork();
if (pid < 0) {
cerr << "fork failed" << endl;
return -1;
} else if (pid == 0) {
serve_client(cs);
return 0;
}
close(cs);
childs.push_back(pid);
cerr << "client_num : " << childs.size() << endl;
}
pid_t child;
while ((child = waitpid(-1, 0, WNOHANG)) > 0) {
list<long>::iterator cit = find(childs.begin(), childs.end(), child);
if (cit != childs.end()) {
childs.erase(cit);
cerr << "client_num : " << childs.size() << endl;
}
}
}
return 0;
}
rexp
2004-02-02
打赏
举报
回复
你一定要用fork也是可以的,
exec是不需要了。
SIGCHLD处理一把
icedust
2004-02-02
打赏
举报
回复
use libpthread
1小时速通操作系统!期末
高分
通过!#操作系统 #大三 #期末复习 #考研 #速成
碎片问题:经过一段时间的分配回收后,内存中存在很多很小的空闲块。它们每一个都很小,不足以满足分配要求;但其总和满足分配要求。这些空闲块被称为碎片。特点:易于实现,会使系统平均周转时间最短,系统吞吐量大。但忽视了作业的等待时间,不利于长作业,会出现“饿死”现象。例题:在多道批处理系统中,有下列1、2、3、4四个作业,提交时间分别是6.0、6.5、7.0、7.5,执行时间分别是2.0、0.5、0.1、0.2,用先来先服务调度算法和短作业调度算法进行调度,哪一种算法调度性能好些?为什么?虚拟存储。
Go GUI 应用开发实用指南(三)
在本章中,我们探讨了本书要探索的最后一种工具包,Fyne。我们学习了它是如何专门为 Go 创建的,以便于构建图形应用程序。我们很快设置了工具包,并探讨了如何构建在 macOS、Windows 和 Linux 上运行完全相同的应用程序。我们探讨了 Fyne 工具包的架构及其使用矢量图形提供可伸缩的图形界面。通过学习layoutcanvas和widget包的功能,我们看到了如何快速构建基本用户界面。我们还看到了 Fyne 提供的两个不同的主题,浅色和深色,它们将根据用户设置或环境变量来使用。
PuTTY实战指南:Windows下高效安全连接Linux的SSH利器
PuTTY是一款轻量级、开源免费的SSH和Telnet客户端,专为Windows平台设计,广泛用于远程管理Linux/
Unix
服务器
。其核心采用C语言编写,依赖原生Win32 API实现网络通信与终端模拟,具备低资源占用(通常内存<10MB)和高响应速度的优势。支持SSH1/SSH2、Telnet、Rlogin、Serial等多种协议,并通过加密隧道保障数据传输安全。其模块化设计使得PuTTY主程序(putty.exe)无需安装即可运行,尤其适合U盘携带的便携式运维场景。
基于DLNA的开源桌面流媒体
服务器
Oshare-Server-Desktop-Streaming实战解析
在现代流媒体服务系统中,核心功能的稳定性与性能固然重要,但用户体验和可配置性已成为决定产品竞争力的关键因素。随着Oshare-Server-Desktop-Streaming等开源项目的不断演进,用户不再满足于“能用”,而是追求“好用”、“易用”和“个性化”。因此,在具备完整流式传输能力的基础上,进行自定义功能扩展与界面优化,是提升项目实用价值和技术深度的重要方向。本章聚焦于如何从用户交互体验、配置灵活性以及外观定制化三个维度出发,对现有系统进行增强改造。
linux的历史演绎
文章出处:http://www.cnblogs.com/settingyin/archive/2005/09/14/236389.html 首先,强烈建议你看看本书序。里面涉及到我的一个“软件使用度”的概念。很多人对于书的前言或序不感兴趣。笔者个人观点:不仅重要而且必须。想在短时内(如在书店里)评一本书,最主要两点:一是序,二是出版社。如果两者皆满意,基本
Linux/Unix社区
23,224
社区成员
74,537
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章