当前位置: 技术问答>linux和unix
用定时器执行system("sar 1 > sar.txt"),函数出不来
来源: 互联网 发布时间:2015-10-12
本文导语: 我设定了一个定时器,2s为间隔,经过测试,接受定时信号没有问题,每次都可以执行system("echo aaaaa > sar.txt");但是将这句换成system("sar 1 > sar.txt"),就不能从system函数退出来,何故? 设置信号函数: static int setinte...
我设定了一个定时器,2s为间隔,经过测试,接受定时信号没有问题,每次都可以执行system("echo aaaaa > sar.txt");但是将这句换成system("sar 1 > sar.txt"),就不能从system函数退出来,何故?
设置信号函数:
static int setinterrupt()
{
struct sigaction act;
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = fun;//这里是包含执行system("sar 1 > sar.txt")的函数
if((sigemptyset(&act.sa_mask) == -1) ||
(sigaction(SIGALRM, &act, NULL) == -1))
{
return -1;
}
return 0;
}
设置间隔函数:
static int setperiodic(double sec)
{
timer_t timerid;
struct itimerspec value;
if(timer_create(CLOCK_REALTIME, NULL, &timerid) == -1)
{
return -1;
}
value.it_interval.tv_sec = (long)sec;
value.it_interval.tv_nsec = (sec - value.it_interval.tv_sec) * BILLION;
if(value.it_interval.tv_nsec >= BILLION)
{
value.it_interval.tv_sec++;
value.it_interval.tv_nsec -= BILLION;
}
value.it_value = value.it_interval;
return timer_settime(timerid, 0, &value, NULL);
}
设置信号函数:
static int setinterrupt()
{
struct sigaction act;
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = fun;//这里是包含执行system("sar 1 > sar.txt")的函数
if((sigemptyset(&act.sa_mask) == -1) ||
(sigaction(SIGALRM, &act, NULL) == -1))
{
return -1;
}
return 0;
}
设置间隔函数:
static int setperiodic(double sec)
{
timer_t timerid;
struct itimerspec value;
if(timer_create(CLOCK_REALTIME, NULL, &timerid) == -1)
{
return -1;
}
value.it_interval.tv_sec = (long)sec;
value.it_interval.tv_nsec = (sec - value.it_interval.tv_sec) * BILLION;
if(value.it_interval.tv_nsec >= BILLION)
{
value.it_interval.tv_sec++;
value.it_interval.tv_nsec -= BILLION;
}
value.it_value = value.it_interval;
return timer_settime(timerid, 0, &value, NULL);
}
|
shell下直接运行,根据你的结果,是不支持阻塞的。
但是在程序里,act.sa_flags = SA_SIGINFO ;却未声明不支持阻塞,因此程序在某个部分的确阻塞住了。后来你通过act.sa_flags = SA_SIGINFO | SA_NODEFER;取消了组塞。
其实就是改变了环境变量的结果。
但是在程序里,act.sa_flags = SA_SIGINFO ;却未声明不支持阻塞,因此程序在某个部分的确阻塞住了。后来你通过act.sa_flags = SA_SIGINFO | SA_NODEFER;取消了组塞。
其实就是改变了环境变量的结果。
|
sar 1> sar.txt能退出么,换sar 1>sar.txt &试试
|
同意楼上,可能阻塞住了,试试。
|
非也!!!请加上绝对路径试一试,也就是sar的绝对路径