当前位置: 技术问答>linux和unix
关于Linux下信号处理的一个问题,请大家帮忙看看!
来源: 互联网 发布时间:2015-10-09
本文导语: 我初学Linux,遇到了一个信号处理的问题,请高手指教: void auto_do_0(int signo) { job0; ...... } void auto_do_1(int signo) { job1; ...... } void on_time_do_0(void) { struct sig...
我初学Linux,遇到了一个信号处理的问题,请高手指教:
void auto_do_0(int signo)
{
job0;
......
}
void auto_do_1(int signo)
{
job1;
......
}
void on_time_do_0(void)
{
struct sigaction act;
act.sa_handler = auto_do_0;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM, &act, NULL);
settimer(...);
}
void on_time_do_1(void)
{
struct sigaction act;
act.sa_handler = auto_do_1;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM, &act, NULL);
settimer(...);
}
int main(void)
{
......
on_time_do_0();
on_time_do_1();
......
}
执行后,程序只做了on_time_do_1(),而前一个on_time_do_0()没有做,请问要怎样写才能使两个定时触发的操作都执行?
谢谢!
void auto_do_0(int signo)
{
job0;
......
}
void auto_do_1(int signo)
{
job1;
......
}
void on_time_do_0(void)
{
struct sigaction act;
act.sa_handler = auto_do_0;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM, &act, NULL);
settimer(...);
}
void on_time_do_1(void)
{
struct sigaction act;
act.sa_handler = auto_do_1;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction(SIGALRM, &act, NULL);
settimer(...);
}
int main(void)
{
......
on_time_do_0();
on_time_do_1();
......
}
执行后,程序只做了on_time_do_1(),而前一个on_time_do_0()没有做,请问要怎样写才能使两个定时触发的操作都执行?
谢谢!
|
又看一下LZ的程序,LZ只用了一个信号SIGALRM,所以后面的设置有效,前面的被盖掉。
|
int kill(pid_t pid, int sig);
void (*signal(int signum, void (*sighandler)(int)))(int);
void (*signal(int signum, void (*sighandler)(int)))(int);
|
老大我晕了,SIGALRM是一个宏定义,其实它是一个整数,系统提供了两个用户信号usr1和usr2.但是具体怎么定义我不清楚了,你去查一下不就知道了吗?你能找到SIGALRM,也能找到这两个信号.好象是SIG_USR1 SIG_USR2
|
使用一个信号,在对应的处理中设计两个长度不同的计数器,不就可以了吗
|
系统定时这个我没去注意,不过可以提醒LZ,是不是系统只能有一个定时,后面的定时会把前面的盖掉?
|
SIGALRM是一个宏定义是个整数,setitimer怎么可能只以发这个信号呢?难道这个函数内部还要去
检查这个值吗???那是不可能的.还有很多方法的.先把这个问题搞定再说别的.
楼上的是一个办法.
检查这个值吗???那是不可能的.还有很多方法的.先把这个问题搞定再说别的.
楼上的是一个办法.