当前位置: 技术问答>linux和unix
关于循环触发alarm调用heandler的问题,谢谢指点,解决立马结贴!
来源: 互联网 发布时间:2016-08-04
本文导语: 每次fork出子程序,运行程序1,若超过3秒就kill子程序,同时主程序继续调用程序2,若超时就kill子程序,主程序运行程序3.当然若不超时就等子程序返回后主程序继续运行下一个程序. 我的目的就是要把程序1-n都运行一遍,中...
每次fork出子程序,运行程序1,若超过3秒就kill子程序,同时主程序继续调用程序2,若超时就kill子程序,主程序运行程序3.当然若不超时就等子程序返回后主程序继续运行下一个程序.
我的目的就是要把程序1-n都运行一遍,中途若有运行超过三秒的就kill掉,继续自动执行下面的程序.
该怎么写? 应该要用到fork,alarm,handler,wait或pause等.
谢谢,在线结贴.
若需要我可以把我写的代码贴一下,大家帮我看看哪里有问题.
我的目的就是要把程序1-n都运行一遍,中途若有运行超过三秒的就kill掉,继续自动执行下面的程序.
该怎么写? 应该要用到fork,alarm,handler,wait或pause等.
谢谢,在线结贴.
若需要我可以把我写的代码贴一下,大家帮我看看哪里有问题.
|
楼主你的代码在我这里没错呀
我在handler加了个输出
void handler(int thesig){
printf("hander");
kill(pid, SIGKILL);
}
我的执行文件test.sh
execlp("/root/test/test.sh", "test.sh",NULL);
test.sh内容
#!/bin/bash
echo "test.sh"
sleep 10
handler里面确实去了2次 程序的输出
test.sh
handler
test.sh
handler
所以我怀疑你是不是把execlp函数用错了
我在handler加了个输出
void handler(int thesig){
printf("hander");
kill(pid, SIGKILL);
}
我的执行文件test.sh
execlp("/root/test/test.sh", "test.sh",NULL);
test.sh内容
#!/bin/bash
echo "test.sh"
sleep 10
handler里面确实去了2次 程序的输出
test.sh
handler
test.sh
handler
所以我怀疑你是不是把execlp函数用错了
|
不用alarm也行,试试我这个
#include
#include
#include
#include
#include
#define TSLEEP 5
char *Cmds[2] = { "/usr/bin/xclock",
"/usr/bin/xterm",};
int main() {
pid_t pid;
int s; //exit status
int index = 0;
while (1) {
pid = fork();
if(pid == -1) err(1, "fork");
if(pid == 0) {
execl(Cmds[index], "", (char *)NULL);
exit(1);
}
sleep(TSLEEP);
kill(pid, SIGTERM);
sleep(1);
kill(pid, SIGKILL);
if(wait(&s) == -1) err(1, "wait");
if(WIFSIGNALED(s) && (WTERMSIG(s) == SIGTERM || WTERMSIG(s) == SIGKILL)) puts("killed");
else if(WIFEXITED(s) && WEXITSTATUS(s) == 0) puts("exited normally");
else puts("other case");
index=++index%2;
}
return EXIT_SUCCESS;
}
#include
#include
#include
#include
#include
#define TSLEEP 5
char *Cmds[2] = { "/usr/bin/xclock",
"/usr/bin/xterm",};
int main() {
pid_t pid;
int s; //exit status
int index = 0;
while (1) {
pid = fork();
if(pid == -1) err(1, "fork");
if(pid == 0) {
execl(Cmds[index], "", (char *)NULL);
exit(1);
}
sleep(TSLEEP);
kill(pid, SIGTERM);
sleep(1);
kill(pid, SIGKILL);
if(wait(&s) == -1) err(1, "wait");
if(WIFSIGNALED(s) && (WTERMSIG(s) == SIGTERM || WTERMSIG(s) == SIGKILL)) puts("killed");
else if(WIFEXITED(s) && WEXITSTATUS(s) == 0) puts("exited normally");
else puts("other case");
index=++index%2;
}
return EXIT_SUCCESS;
}
|
使用一下的结构
int main()
{
signal(SIGALRM,handler);
alarm(3)
while(1)
pause();
return 0;
}
void handler(int sig)
{
//your operation
alarm(3)
return;
}
我这个只是个大致框架,楼主可以参考参考
|
笔误 应该是
void handler(int thesig){
printf("handern");
kill(pid, SIGKILL);
}
void handler(int thesig){
printf("handern");
kill(pid, SIGKILL);
}
|
按照LZ的代码,刚刚我也运行了一遍,基本没问题。
不知道是不是因为机器的原因。
根据我自己的经验,多次循环的调用alarm,对于比较精细的定时,比较容易出错。
我曾今使用alarm定时,本来就只几秒钟的事情,他还有时候给我推迟,有时候给我提前
几秒钟的事情还这样,是不可忍受的。
|
你还是把你的代码贴出来吧 大家给你找错
|
看的有点晕~~~~~