如何中断pselect?

如何中断pselect?,c,select,signals,C,Select,Signals,这是我的代码,我不能用信号中断主循环。当我启动SIGUSR1时,会调用信号处理程序,但我不会取消阻止pselect #include <errno.h> #include <signal.h> #include <stdio.h> int end = 1; void handler(int sig) { end = 1; } int main() { sigset_t blockset; struct sigaction sa;

这是我的代码,我不能用信号中断主循环。当我启动SIGUSR1时,会调用信号处理程序,但我不会取消阻止pselect

#include <errno.h>
#include <signal.h>
#include <stdio.h>

int end = 1;

void handler(int sig) {
    end = 1;
}

int main() {
    sigset_t blockset;
    struct sigaction sa;
    int res;

    /* Block the signal */
    sigemptyset(&blockset);
    sigaddset(&blockset, SIGUSR1);
    sigprocmask(SIG_BLOCK, &blockset, NULL);

    /* Install handler */
    sa.sa_sigaction = handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = SA_RESTART;
    sigaction(SIGUSR1, &sa, NULL);

    /* Unblock signal; wait for signal */
    while(end) {
        sigemptyset(&emptyset);    /* Signal mask to use during pselect() */
        res = pselect(0, NULL, NULL, NULL, NULL, &emptyset);
        if (errno == EINTR)
            printf("Interrupted by SIGUSR1.");
    }
}
#包括
#包括
#包括
int-end=1;
无效处理程序(int sig){
结束=1;
}
int main(){
sigset\u t块集;
struct-sigaction-sa;
国际关系;
/*封锁信号*/
SIGEPTYSET(块集和块集);
sigaddset(&块集,SIGUSR1);
sigprocmask(SIG_块和块集,空);
/*安装处理程序*/
sa.sa_sigaction=handler;
sigemptyset(和sa.sa_面具);
sa.sa_标志=sa_重启;
sigaction(SIGUSR1,&sa,NULL);
/*解锁信号;等待信号*/
(完){
sigemptyset(&emptyset);/*在pselect()期间使用的信号掩码*/
res=pselect(0,NULL,NULL,NULL,NULL,&emptyset);
如果(errno==EINTR)
printf(“被SIGUSR1打断”);
}
}

起初,我认为这是因为您使用的是
sau RESTART
。这与你想要的正好相反。然而,事实证明,
pselect
忽略了
SA_RESTART
,所以不是这样


结果是,
pselect
正在返回,
errno
正在
EINTR
。您只是没有看到消息,因为您没有刷新标准输出的缓冲区

您可以在将输出发送到
stdout
之后使用
fflush
来实现这一点

fflush(stdout);
但是当输出到终端时,
stdout
是行缓冲的,所以简单地添加缺少的换行符就可以了

printf("Interrupted by SIGUSR1.\n");

如果不是第二个错误,您甚至不会注意到上述问题<代码>标准输出通常在程序退出时刷新,但您的程序不会退出,因为您有

int end = 1;

void handler(int sig) {
    end = 1;
}

while (end) { ... }
当你想做的时候

int end = 0;

void handler(int sig) {
    end = 1;
}

while (!end) { ... }

起初,我认为这是因为您使用了
sau RESTART
。这与你想要的正好相反。然而,事实证明,
pselect
忽略了
SA_RESTART
,所以不是这样


结果是,
pselect
正在返回,
errno
正在
EINTR
。您只是没有看到消息,因为您没有刷新标准输出的缓冲区

您可以在将输出发送到
stdout
之后使用
fflush
来实现这一点

fflush(stdout);
但是当输出到终端时,
stdout
是行缓冲的,所以简单地添加缺少的换行符就可以了

printf("Interrupted by SIGUSR1.\n");

如果不是第二个错误,您甚至不会注意到上述问题<代码>标准输出通常在程序退出时刷新,但您的程序不会退出,因为您有

int end = 1;

void handler(int sig) {
    end = 1;
}

while (end) { ... }
当你想做的时候

int end = 0;

void handler(int sig) {
    end = 1;
}

while (!end) { ... }

起初,我认为这是因为您使用了
sau RESTART
。这与你想要的正好相反。然而,事实证明,
pselect
忽略了
SA_RESTART
,所以不是这样


结果是,
pselect
正在返回,
errno
正在
EINTR
。您只是没有看到消息,因为您没有刷新标准输出的缓冲区

您可以在将输出发送到
stdout
之后使用
fflush
来实现这一点

fflush(stdout);
但是当输出到终端时,
stdout
是行缓冲的,所以简单地添加缺少的换行符就可以了

printf("Interrupted by SIGUSR1.\n");

如果不是第二个错误,您甚至不会注意到上述问题<代码>标准输出通常在程序退出时刷新,但您的程序不会退出,因为您有

int end = 1;

void handler(int sig) {
    end = 1;
}

while (end) { ... }
当你想做的时候

int end = 0;

void handler(int sig) {
    end = 1;
}

while (!end) { ... }

起初,我认为这是因为您使用了
sau RESTART
。这与你想要的正好相反。然而,事实证明,
pselect
忽略了
SA_RESTART
,所以不是这样


结果是,
pselect
正在返回,
errno
正在
EINTR
。您只是没有看到消息,因为您没有刷新标准输出的缓冲区

您可以在将输出发送到
stdout
之后使用
fflush
来实现这一点

fflush(stdout);
但是当输出到终端时,
stdout
是行缓冲的,所以简单地添加缺少的换行符就可以了

printf("Interrupted by SIGUSR1.\n");

如果不是第二个错误,您甚至不会注意到上述问题<代码>标准输出通常在程序退出时刷新,但您的程序不会退出,因为您有

int end = 1;

void handler(int sig) {
    end = 1;
}

while (end) { ... }
当你想做的时候

int end = 0;

void handler(int sig) {
    end = 1;
}

while (!end) { ... }

池上,你是对的;end=1是不正确的,但是按照你说的做,我的代码不工作……但是我的问题不清楚:我要停止的pselect在一个单独的线程上。有什么不同吗?池上,你是对的;end=1是不正确的,但是按照你说的做,我的代码不工作……但是我的问题不清楚:我要停止的pselect在一个单独的线程上。有什么不同吗?池上,你是对的;end=1是不正确的,但是按照你说的做,我的代码不工作……但是我的问题不清楚:我要停止的pselect在一个单独的线程上。有什么不同吗?池上,你是对的;end=1是不正确的,但是按照你说的做,我的代码不工作……但是我的问题不清楚:我要停止的pselect在一个单独的线程上。有什么不同吗?