当前位置:  技术问答>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可以把整个进程关闭,可是在以前没有出现过信号不能打断阻塞函数的问题,请高手帮忙看一下,谢了

|
源于BSD的系统会重启被信号中断的系统调用.
楼主可以用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).

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 自旋锁和读写自旋锁、信号量和读写信号量分别有什么区别?
  • semaphore.h sem.c Posix 信号量 System v 信号量
  • 书上说,中断用自旋锁,进程,用信号量,但是,为什么中断不能用信号量?
  • 请问线程中的信号量,怎么设置成0,1信号量?
  • 关于信号量与UNIX信号的疑问
  • 多个进程共用一个信号量,如果某个进程死掉,此时又将信号量锁定,其它进程就死掉,有什么办法可以解决这一问题
  • 当信号量(灯)遇上信号,help!
  • POSIX:有名信号量 和SYStem V的信号量 你用哪个?
  • 求助一些关于信号量的问题
  • 关于消息队列信号量信号共享内存等核心编程的问题(求知若渴!!!.....)
  • linux 中信号量的使用 当信号初始化的时候设置的值大于1将是如何?
  • 关于信号量的问题
  • 【求助】多进程中 内核信号量无效?
  • 为什么中断不能用信号量?
  • 信号量
  • 信号量释放
  • 信号量的烦恼
  • 信号量的问题
  • 进程间通过信号量通信
  • 信号量的调整值什么意思


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3