创建一个计时器,运行两次就进程中止了.问题在哪里呢?
来源: 互联网 发布时间:2017-02-06
本文导语: 我创建一个进程,目的是一个计时器每隔1s钟打印一个信息,无穷循环。 结果是执行了2s,打印了2次信息就结束了。问题出在哪里呢? 我是vmware里面安装的centos62 程序输出是: $ g++ test1.cpp -lrt && ./a.out signa...
我创建一个进程,目的是一个计时器每隔1s钟打印一个信息,无穷循环。
结果是执行了2s,打印了2次信息就结束了。问题出在哪里呢? 我是vmware里面安装的centos62
程序输出是:
$ g++ test1.cpp -lrt && ./a.out
signal: 34
signal: 34
我错在哪里? 代码如下:
结果是执行了2s,打印了2次信息就结束了。问题出在哪里呢? 我是vmware里面安装的centos62
程序输出是:
$ g++ test1.cpp -lrt && ./a.out
signal: 34
signal: 34
我错在哪里? 代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
void SigHandler(int sig, siginfo_t *si, void *uc)
{
char buf[64];
sprintf( buf, "signal: %dn", sig);
write(STDOUT_FILENO,buf,strlen(buf));
if (sig == SIGINT)
{
printf("SIGINTn");
_exit(0);
}
else if (sig == SIGRTMIN)
{
}
}
int CreateTimer(int sig, int sec)
{
struct sigaction act;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
act.sa_sigaction = SigHandler;
if (sigaction(SIGINT, &act, NULL) == -1
|| sigaction(SIGRTMIN, &act, NULL) == -1)
{
printf("sigaction failedn");
return 0;
}
timer_t timerid;
struct sigevent sev;
struct itimerspec its;
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = sig;
sev.sigev_value.sival_ptr = &timerid;
if (timer_create(CLOCK_REALTIME, &sev, &timerid) == -1)
{
printf("timer_create errorn");
return 0;
}
its.it_value.tv_sec = sec;
its.it_value.tv_nsec = 0;
its.it_interval.tv_sec = its.it_value.tv_sec;
its.it_interval.tv_nsec = its.it_value.tv_nsec;
if (timer_settime(timerid, 0, &its, NULL) == -1)
{
printf("timer_settime errorn");
return 0;
}
return 1;
}
int main(void)
{
if(!CreateTimer(SIGRTMIN, 1))return 1;
sleep(5);
getchar();
return 0;
}
|
你这样不能无限循环
信号依次中断了你的sleep(5) 与getchar(),程序就结束了
在main()中添加一句
while(1) pause();
信号依次中断了你的sleep(5) 与getchar(),程序就结束了
在main()中添加一句
while(1) pause();
|
没有办法让信号不中断你的recv,除非你忽略了这个信号,或者临时屏蔽了这个信号。
被信号中断时,recv()失败,对应的错误码errno通常是EINTR,
你可以判断这个错误码,然后循环调用recv
或者你可以在信号处理函数中设置一个全局变量,recv失败时判断这个全局变量,以辨别是否被信号中断
被信号中断时,recv()失败,对应的错误码errno通常是EINTR,
你可以判断这个错误码,然后循环调用recv
或者你可以在信号处理函数中设置一个全局变量,recv失败时判断这个全局变量,以辨别是否被信号中断
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。