免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4833 | 回复: 20
打印 上一主题 下一主题

[C] 请教一个多线程的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-03 20:40 |只看该作者 |倒序浏览
10可用积分
大家给点思路

程序大致是这样
1.用进程间socket来实现两个进程间的通信,用的是短连接。
2.在一个进程中开启一个服务线程(server)线程不退出,一直循环的accept)来监听另一个进程(client)发送过来的请求,accept后再开启一个线程去处理相应的事件。

现在的情况是有的时候client这边会连不上server但并不是经常出现,连接失败的信息是server主动拒绝连接,一般出现这种情况很有可能是server挂掉造成的,但现在
没有办法查看server线程是否挂掉,大家能不能给点意见?

查找问题的意见或优化现有处理方式的都可以

谢谢

最佳答案

查看完整内容

线程没有挂掉这样一个说法的。一般说挂掉,就是进程挂掉。线程没工作,一般是两个原因:1,线程block住了2,线程从某个路径退出了你的情况是哪种?是线程不工作了,还是整个进程挂掉了?如果只是线程不工作了,那么是线程阻塞了还是线程退出了?

论坛徽章:
0
2 [报告]
发表于 2009-07-03 20:40 |只看该作者
原帖由 JavaAnd 于 2009-7-3 20:40 发表
大家给点思路

程序大致是这样
1.用进程间socket来实现两个进程间的通信,用的是短连接。
2.在一个进程中开启一个服务线程(server)线程不退出,一直循环的accept)来监听另一个进程(client)发送过来的请求, ...



线程没有挂掉这样一个说法的。一般说挂掉,就是进程挂掉。

线程没工作,一般是两个原因:
1,线程block住了
2,线程从某个路径退出了

你的情况是哪种?是线程不工作了,还是整个进程挂掉了?如果只是线程不工作了,那么是线程阻塞了还是线程退出了?

论坛徽章:
0
3 [报告]
发表于 2009-07-03 21:15 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2009-07-03 21:47 |只看该作者
可以用deamontools进行监控~~~~
写个启动shell:
#!/bin/bash
./a.out    ---------------你的server程序
-------------------------------------------------------

deamontools 安装:
-----------------------------------------------------------------
安装daemontools

daemontools是一个收集管理UNIX进程的工具.用它来监听qmail-send,qmail-smtpd,qmail-pop3d.

参考:http://cr.yp.to/daemontools.html



#安装:

cd /home/pkg

tar -zxvf daemontools-0.76.tar.gz

cd admin/daemontools-0.76

patch -p1 < /home/pkg/netqmail-1.05/other-patches/daemontools-0.76.errno.patch

package/install

源文档 <http://www.linux-cn.com/html/net ... 070528/43356_3.html>
------------------------------------------------------------------------------------------------------------------------------------------

具体 使用和安装,还可以参考:
http://www.enet.com.cn/article/2008/0221/A20080221162672.shtml

如果有些东西找不到,或者出现安装错误,要打个补丁,在这里有:
http://www.xuki.org/qmail_2.9.tar.gz


-------------------------------------------------------------------------------
绝对的好东西,以后,你可以用它来监控任何的程序和进程~~~~

论坛徽章:
0
5 [报告]
发表于 2009-07-04 08:31 |只看该作者
谢谢上面两位的回答,3楼所说的工具应该只能监控到进程吧?现的的情况是想搞清楚为什么server线程会死,下面写下代码
server

while(1)
{
    printf("eeeee");
    if(accept() < 0)
    {
       printf()
       continue;
     }
     thread_creat()//其它处理

}
基本的流程就是这样,如果client端出现连接被拒绝时,server端不会有任何的打印,包括accept小于0里面的打印,所以我怀疑是线程挂掉了,也想证明这个情况,因为server线程就做这
些事情,看程序没感觉有什么问题,不知道为什么会挂掉

写个程序守护这个线程是可的,只是不到万不得以不想这样掩盖其它地方的错误

[ 本帖最后由 JavaAnd 于 2009-7-4 08:36 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-07-04 09:01 |只看该作者
那就编译的时候加上调试选项:
gcc -o a.out hello.c -g
这样会产生一个core文件,你再设置下系统参数:
unlimit -c 1000

这样才会产生core 接着用gdb调试之:
gdb a.out core
----------------------------------------------
你也可以参考:
http://zhangyafeikimi.javaeye.com/blog/249886

只要是非正常挂掉,都可以捕获到错误的发生地点和原因

论坛徽章:
0
7 [报告]
发表于 2009-07-04 09:56 |只看该作者
accept用select监控看看,还有你的连接有多少个达到1000个没有?

论坛徽章:
0
8 [报告]
发表于 2009-07-04 10:00 |只看该作者
谢谢楼上回复,你说的gdb调试应该是整个应用程序挂掉才会生成core文件,现在的情况是整个进程还在跑,只是其中的一个服务线和感觉是挂了,导致client端连不上

论坛徽章:
0
9 [报告]
发表于 2009-07-04 16:43 |只看该作者
给它写个信号处理程序,处理SIGUSR,打印点东西
然后怀疑它挂了时给它发信号SIGUSR,看它还反应不

论坛徽章:
0
10 [报告]
发表于 2009-07-04 19:48 |只看该作者
原帖由 JavaAnd 于 2009-7-4 10:00 发表
谢谢楼上回复,你说的gdb调试应该是整个应用程序挂掉才会生成core文件,现在的情况是整个进程还在跑,只是其中的一个服务线和感觉是挂了,导致client端连不上


汗,感觉挂了?晕死了~~~~你开始可以连上的吗? 一段时间就不可以了? 如果不小心挂的话,整个进程应该也跟着挂的!~~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP