LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 943|回复: 4

C超时处理求助

[复制链接]
发表于 2005-9-2 00:23:26 | 显示全部楼层 |阅读模式
问个菜问题:c里面如何处理超时?
假设我想让system("sh sleep.sh");5秒钟内没响应就kill掉sleep这个进程,请问该怎么写?
发表于 2005-9-2 09:34:32 | 显示全部楼层
不知道你5秒内没响应是指什么?因为你用了system()以后,你原来工作的进程就被sleep.sh跟挤占了。你的意思是这个sleep.sh是个会产生阻塞的程序?而且一旦产生阻塞超过5秒你就要kill掉sleep.sh?
如果我上面的理解是对的,那么可以这样作,先fork一个子进程,在子进程里执行system("sh sleep.sh"),
与此同时在父进程里注册一个SIGALARM信号处理器,触发的时间为5秒,这个信号处理器会向子进程先发个SIGUSR1信号,sleep.sh应该能接收到该信号,并也有相应的信号处理器函数加以处理,如果sleep.sh发现自己阻塞了,就可以发个信号给父进程如SIGUSR1,如果没有阻塞可以发个信号给父进程例如SIGUSR2等。
这样父进程就获取了sleep.sh的状态,然后就可以决定是否用kill的方式杀死sleep.sh了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-2 10:33:16 | 显示全部楼层
那在父进程中该如何kill掉子进程呢?
回复 支持 反对

使用道具 举报

发表于 2005-9-2 10:44:27 | 显示全部楼层
Post by heiyoyo
那在父进程中该如何kill掉子进程呢?

system函数是产生子进程后父进程就自己挂起知道system返回
建议直接用unix系统调用中的exec函数族
回复 支持 反对

使用道具 举报

发表于 2005-9-2 11:01:11 | 显示全部楼层
好的,先简单总结一下:
1. 如果子进程在阻塞时不能接收信号,还不知道该怎么办
2. 如果子进程阻塞时能够接收信号,那么可以按照realtang兄的做法,另外,必须参考chai2010兄的建议
3. 对于父进程怎样杀掉子进程,也一样,通过给子进程发信号的方式

请继续
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表