如何中断pselect?
这是我的代码,我不能用信号中断主循环。当我启动SIGUSR1时,会调用信号处理程序,但我不会取消阻止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;
#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在一个单独的线程上。有什么不同吗?