当前位置: 技术问答>linux和unix
为什么信号量无法打断阻塞函数??
来源: 互联网 发布时间:2016-03-06
本文导语: 我用一个Ctrl+c信号来打断 读取消息队列的阻塞函数,在以往的一些Red linux系统中,都没什么问题,而我又装了一台Red linux系统,程序在这台机器上不能很好的运行,就是因为Ctrl+c信号没有打断 读取消息队列的这个...
我用一个Ctrl+c信号来打断 读取消息队列的阻塞函数,在以往的一些Red linux系统中,都没什么问题,而我又装了一台Red linux系统,程序在这台机器上不能很好的运行,就是因为Ctrl+c信号没有打断 读取消息队列的这个阻塞函数 。
bool bstop = false;
void msgDeal(void* nqueue){
while(!bstop){
//读取消息队列(阻塞函数)
}
}
void signalDeal(int signal){
bstop = true;
}
int main(){
signal(SIGINT, signalDeal);
signal(SIGTERM, signalDeal);
//。。。。。
//启动线程
}
上面就是我的程序的基本结构,信号的目的就是利用Ctrl+c可以把整个进程关闭,可是在以前没有出现过信号不能打断阻塞函数的问题,请高手帮忙看一下,谢了
bool bstop = false;
void msgDeal(void* nqueue){
while(!bstop){
//读取消息队列(阻塞函数)
}
}
void signalDeal(int signal){
bstop = true;
}
int main(){
signal(SIGINT, signalDeal);
signal(SIGTERM, signalDeal);
//。。。。。
//启动线程
}
上面就是我的程序的基本结构,信号的目的就是利用Ctrl+c可以把整个进程关闭,可是在以前没有出现过信号不能打断阻塞函数的问题,请高手帮忙看一下,谢了
|
源于BSD的系统会重启被信号中断的系统调用.
楼主可以用sigaction控制, 让系统不要重启被中断的系统调用.
楼主可以用sigaction控制, 让系统不要重启被中断的系统调用.
/*
* file: sig_int.c
* date: 2008-02-29
* auth: mymtom
*/
#include
#include
#include
#include
#include
static int b = 0;
static void
sig_int(int signum)
{
b = 1;
}
static void
do_it(void *pdata)
{
char c;
int fd[2];
pipe(fd);
for (; !b; ) {
printf("reading...n");
if (read(fd[0], &c, 1) == -1) {
perror("read");
}
printf("donen");
}
}
int
main(void)
{
struct sigaction sa;
sa.sa_handler = sig_int;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGINT, &sa, NULL) == -1) {
perror("sigaction");
exit(1);
}
do_it(NULL);
return 0;
}
|
man sigaction 中的一段描述了这个问题:
If a signal is caught during the system calls listed below, the call may
be forced to terminate with the error EINTR, the call may return with a
data transfer shorter than requested, or the call may be restarted.
Restart of pending calls is requested by setting the SA_RESTART bit in
sa_flags. The affected system calls include open(2), read(2), write(2),
sendto(2), recvfrom(2), sendmsg(2) and recvmsg(2) on a communications
channel or a slow device (such as a terminal, but not a regular file) and
during a wait(2) or ioctl(2). However, calls that have already committed
are not restarted, but instead return a partial success (for example, a
short read count).