项目中碰到的一个伤脑筋的C语言问题..急.
有一个守护进程,里面有很多个线程,启动和关闭都是通过写SHELL来实现,其中关闭的时候用了killproc函数来关闭进程,而进程那边是需要捕捉kill信号,来实现关闭前的操作,比如将内存(全局结构体,变量等)的内容写到二进制文件中去,而killproc发过来的信号只能捕捉,却不是暂停和屏蔽,所以一方面线程(进程)在一个个的关闭,最后也主进程也关了,而这个时候通过信息捕捉的结束代码(前面提到的内存写文件之类的)也同时在运行,这个时候就存在一个问题,就是信号捕捉的代码和killproc函数关闭程序在争时间,如果信号捕捉的代码在主进程关闭前执行完毕,刚程序正常结束.如果信号捕捉的代码还未执行完毕,进程就结束了.刚程序异常结束,内存中的内容则来不及写到二进制文件.测试了几次,发现当进程负担比较轻的时候,通过SHELL来关闭,刚程序正常结束.如果进程正在处理数据,则异常结束.想通过SLEEP之类的函数也拖延进程关闭,试了几次均告失败,又想通过另一个进程来单独调用结束代码.可是可守护进程结束时,它的所以数据也随之消失,单独进程则取不到数据....
想不出有效的办法,因为程序关闭肯定是要首要保证的,不能留僵尸进程在那边...所以想不出好的办法来跟系统KILL关闭争时间...请求大家帮助....
我的表达可能不是很清楚,请大家多多包涵..
[解决办法]
"就是信号捕捉的代码和killproc函数关闭程序在争时间 "
使用临界区或其他互斥方式?
不知道lz的意思是不是这个
[解决办法]
楼主说的太乱了。
1、“启动和关闭都是通过写SHELL来实现,其中关闭的时候用了killproc函数来关闭进程”
--> 到底是谁来关闭进程?
2、“而killproc发过来的信号只能捕捉”
--> 发给谁?
。。。。。。
sorry,实在看不下去了。。
[解决办法]
看了一下,似乎看懂了,还是有点小晕 :)
LZ的意思是不是对于关闭进程时的代码有疑问,这似乎已经超过了C语言的范围,而是操作系统方面的问题,以及API函数的使用问题。
我猜是这样的,因为对linux(有守护进程,应该是linux吧)的进程调度机制和使用机制不是很了解,所以猜得不对,请拍砖轻些 :)
现在关闭进程时LZ所用代码的流程是这样的,通过shell来调用killproc来关闭该守护进程,于是shell会调用killproc来关闭其中所有的线程,killproc所做的工作就是得到该进程的所有线程的PID,然后向这些PID发送kill消息。
而该守护进程得到kill消息后,某个线程会执行关闭前的一些操作,比如将内存中的一些东西存入文件等。但是killproc可能还没等到这些关闭前的操作做好,整个进程就被kill掉了。
这里似乎感觉逻辑有些问题,肯定不能把执行关闭前操作放在这里,而是应该在之前得到一个关闭前的消息,然后执行关闭前操作,然后再kill之。
反正只能说这样逻辑是不对DI,不过具体怎么样改,mark细看之