unix下,多进程socket 服务器问题

sunj_study 2006-01-17 09:39:47
本人没做过unix下socket的开发,现要做一个多进程socket服务器,请各位大侠帮忙。。
任务要求:控制子进程数为10个,一个子进程对应一个客户端连接socket,响应客户端请求信息(根据请求信息查询服务器的log文件),进行信息交互。

问题:1、子进程数通过一个变量计数控制,还是有别的典型方法?
2、如何做到当客户端close后,服务器端做出响应,杀掉服务器对应的子进程?
...全文
168 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tonyMCM 2006-01-17
  • 打赏
  • 举报
回复
signal(SIGCHLD,sig_chld); //处理僵尸,获取SIGCHLD信号

void sig_chld(int signo)//儿子一中断就消息触发
{
//这里放你要处理的代码
}
tonyMCM 2006-01-17
  • 打赏
  • 举报
回复
巧了 这个我做过 ==给你提示
fierygnu 2006-01-17
  • 打赏
  • 举报
回复
在父进程里计数。
man signal
read返回0
sunj_study 2006-01-17
  • 打赏
  • 举报
回复
int count = 0;
while(1) {
if(count < 11)
{
sin_size = sizeof(struct sockaddr_in);
new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size))

if (new_fd == -1) {
perror("accept");
continue;
}

if (fork() == 0) {
count++;
/* 子进程 */
}
}
}

这样计数?SIGCLD信号如何获取?如果有信号这方面的详细资料请发一下,任务比较急,从头开来不及了,多谢。

2、socket被对端关闭时。
===我的问题是,对端关闭时,服务器如何做出响应?就是如何捕获客户端关闭这个事件?
fierygnu 2006-01-17
  • 打赏
  • 举报
回复
1、自己计数。fork时加1,收到SIGCLD信号减1。
2、socket被对端关闭时。
sunj_study 2006-01-17
  • 打赏
  • 举报
回复
多谢大家帮忙,结帖。
fierygnu 2006-01-17
  • 打赏
  • 举报
回复
gcc是编译器,ld是连接器。如果一个C文件,可以直接用gcc编译连接(gcc负责调用ld)。
sunj_study 2006-01-17
  • 打赏
  • 举报
回复
最后一问:要在unix下编译执行.c文件,用什么命令?
fierygnu 2006-01-17
  • 打赏
  • 举报
回复
是要在父进程调用。
fierygnu 2006-01-17
  • 打赏
  • 举报
回复
SIGCHLD主要是为了通知父进程子进程已退出,需要父进程调用wait来回收资源。如果父进程不做进一步处理,直接ignore,内核会回收资源。
sunj_study 2006-01-17
  • 打赏
  • 举报
回复
signal(SIGCHLD,sig_chld); 应该在父进程调用是吧?

我看到的例子程序这样处理SIGCHLD信号 signal(SIGCLD, SIG_IGN); 如果按第一句那样调用会不会有什么影响?
fierygnu 2006-01-17
  • 打赏
  • 举报
回复
在父进程里计数,不需要保护。
hundlom 2006-01-17
  • 打赏
  • 举报
回复
对,可以这样计数,但这个数你得用一个信号灯或其他的保护起来。以防止并发产生错误计数。
捕捉信号就用signal()函数。之后在回调函数中处理(count--)。

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧