linux下c++守护进程的一个奇怪的“死锁”问题……

某鸟 2009-04-09 10:39:43
系统环境:
fedora 10

应用环境
C++ & ACE

一个++写的守护进程调度器(可根据命令行参数决定是否成为守护进程),
功能就是用ace的事件循环+ace定时器+ace的socket监听。
不断输出一句日志信息以便得知其在正常运行,如收到socket消息,
则返回几个字符,并输出收到的内容到日志。
(如不是守护进程启动的话,将输出到控制台)
如收到指定内容的socket消息,
则通过ace的ProcessManager的Spawn方法启动另一个脚本程序。
调用时是根据自己的argv[0]找自己所在目录,然后启动同一目录的脚本。
脚本也很简单,除了#! /bin/sh就一句echo 或者exit(为了模拟无输出的情况)

现象:
守护进程的情况下,如果直接./xxx启动,则可能会无法得知自己所在位置导致启动脚本失败,
发生死锁,并出现一个僵尸进程。这个是绝对的。

问题:
可是,全路径名方式启动的守护进程,如收到消息调用脚本,
竟然也可能在连续几次后调度器就发生死锁。为什么?

开始几次发消息调用另一个脚本都正常,可为啥在几次后就又死锁了呢?
而且这时是没有僵尸进程的,只有一个调度器进程。
即使是通过/bin/sh /xx/xxxx/xxx.sh这样启动这个脚本也会出问题。
为什么呢?

我现在觉得似乎是句柄导致的死锁...
本来想在linux开发版问的,但考虑到这边的牛似乎比那边的多……
...全文
452 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
某鸟 2009-05-13
  • 打赏
  • 举报
回复
确认是SIGHLD信号和waitpid处理(用于解决僵尸)的问题……

启用ace自带的避免僵尸方法,搞定~
  • 打赏
  • 举报
回复
你的守护进程怎么来的?
用的系统调用?
Paradin 2009-04-09
  • 打赏
  • 举报
回复
学习。帮顶。
某鸟 2009-04-09
  • 打赏
  • 举报
回复
汗,不是没僵尸,是一定有,sh变成僵尸了,明明启动的/bin/sh,僵尸进程竟然显示sh...
内存泄漏吗?!
Wolf0403 2009-04-09
  • 打赏
  • 举报
回复
某鸟 2009-04-09
  • 打赏
  • 举报
回复
好像解决了……

似乎是SIGHLD信号和waitpid处理(跟日志输出冲突?)的问题,
那句日志控制只不过是表象而已……

怎么每次都是遇到问题好多天无法搞定,到这一发帖就解决了……怎么搞得...

多谢各位先~如果还没解决,再继续……
某鸟 2009-04-09
  • 打赏
  • 举报
回复
楼上你说的是一种方法,但是不到最后我不会尝试这个方法的,因为ace的调试宏可以随时重定向到任何地方……
偶还没水平能用最小的代码写出那样的效果来~
threeleafzerg007 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 21bird 的回复:]
根据以前看过的,似乎gdb看到卡在什么ACE的什么log_mutex_lock.里面……

现在基本确认了,就是因为
ACE_LOG_MSG->open(argv[0], ACE_Log_Msg::SYSLOG, ACE_TEXT("mgr"));
有了这句,我启动第一次可能不会有问题,但第二次很可能出问题。
可这句话我不能不用啊~

而据说spwan无非就是fork&exec。。。
莫非fork后,exec前要做啥特殊处理吗?

[/Quote]

简单,你就用linux的syslog不就得了,省去ACE的,syslog用的时候都不用open 呵呵。
某鸟 2009-04-09
  • 打赏
  • 举报
回复
汗一下~偶可没说fedora有问题,事实上,在centos上也是如此~

到底谁和谁凑一起不能直接用呢?到底少了什么呢?
morris88 2009-04-09
  • 打赏
  • 举报
回复
fedora 发行版不会出这种低级问题,那貌似就出在你的程序上了!
某鸟 2009-04-09
  • 打赏
  • 举报
回复
根据以前看过的,似乎gdb看到卡在什么ACE的什么log_mutex_lock.里面……

现在基本确认了,就是因为
ACE_LOG_MSG->open(argv[0], ACE_Log_Msg::SYSLOG, ACE_TEXT("mgr"));
有了这句,我启动第一次可能不会有问题,但第二次很可能出问题。
可这句话我不能不用啊~

而据说spwan无非就是fork&exec。。。
莫非fork后,exec前要做啥特殊处理吗?
threeleafzerg007 2009-04-09
  • 打赏
  • 举报
回复
再死锁

用gdb attach上去的话

总能知道 死锁在哪个函数里的吧

靠看代码很难
某鸟 2009-04-09
  • 打赏
  • 举报
回复
嗯....
ACE::daemonize();
daemon(0, 0);
都试过了,发现跟守护进程无关,反正就是死锁……去掉这两句也没用。
对了,我使用了n个ACE的调试宏输出……
所以main()开头还有句:
ACE_LOG_MSG->open(argv[0], ACE_Log_Msg::SYSLOG, ACE_TEXT("mgr"));
看来似乎是这句话的引起的矛盾?

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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