- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我最近一直在研究 Linux 上的信号处理,并阅读了所有与信号处理相关的概念。一个困扰我的问题是,为什么在进程畅通无阻时,sigtimedwait() 集合中的信号没有被传递。我的代码如下:-
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
void sighandler1(int sig)
{
printf("SIGINT caught\n");
}
void sighandler2(int sig)
{
printf("SIGTSTP caught\n");
}
void sighandler3(int sig)
{
printf("SIGALRM caught\n");
}
int main()
{
sigset_t s1,s2;
struct sigaction act1,act2,act3;
int ret;
sigemptyset(&s1);// The bit-mask s1 is cleared
sigaddset(&s1,SIGINT);//Add SIGINT to the bit-mask s1
sigemptyset(&s2);// The bit-mask s2 is cleared
sigaddset(&s2,SIGALRM);//Add SIGALRM to the bit-mask s2
sigprocmask(SIG_BLOCK,&s2,NULL);//Signal(s) in s2 blocked
act1.sa_handler = sighandler1; //function pointer pointing to the signal handler
act1.sa_flags = 0;
sigaction(SIGINT,&act1,NULL); // installing the action
// for SIGINT
act2.sa_handler = sighandler2; //function pointer pointing to another signal handler
act2.sa_flags = 0; // no flags
sigaction(SIGTSTP,&act2,NULL); // installing the action
// for SIGTSTP
act3.sa_handler = sighandler3; //function pointer pointing to another signal handler
act3.sa_flags = 0; // no flags
sigaction(SIGALRM,&act3,NULL); // installing the action for SIGALRM
sigprocmask(SIG_SETMASK,&s1,NULL); //Signals in s1 blocked and other signals unblocked
printf("sigprocmask() called with SIG_SETMASK on s1,which contains SIGINT\n");
printf("Blocked on sigtimedwait() with s1\n");
if(sigtimedwait(&s1,NULL,NULL) < 0)
{
if(errno == EINTR)
printf("Some other signal caught\n");
}
printf("This is a process. You can pass signal to it\n");
while(1);
}
为了更清楚地说明问题,我在上面的代码中调用了 sigtimedwait,并将“s1”作为“set”参数。该集合仅包含信号 SIGINT。根据手册页,sigtimedwait() 会阻塞进程,直到传递其集合中的一个信号。我完全同意这种说法。但是为什么当我通过 SIGINT 来解锁进程时没有调用 SIGINT 处理程序?另一方面,当我传递集合中不存在的 SIGALRM 或 SIGTSTP 时,会按预期返回 EINTR,并且还会调用信号处理程序。
对于任何想观察场景的人,都可以执行上面的代码,然后将 SIGINT 传递给它。他们将观察到进程在没有调用处理程序的情况下畅通无阻。为什么不调用处理程序?我是否误解了 sigtimedwait() 手册页的任何部分??
最佳答案
sigtimedwait 似乎返回信号值,而不是信号处理程序被捕获:
switch(sigtimedwait(&s1,NULL,NULL))
{
default:
printf ("Some other signal???");
break;
case SIGINT:
printf ("We got SIGINT\n");
break;
case -1:
perror ("sigtimedwait");
break;
}
关于linux - sigtimedwait() 的 "set"参数中的信号未传送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36675011/
我应该实现一个信号处理程序,它在第一次调用某个信号时停止程序中的所有线程,如果它们已经停止则恢复它们。我使用以下代码实现了在后台运行的恶魔线程: void *handle_sig(void *arg)
我尝试根据下面的代码使用 sigtimedwait,我收到此消息“捕获意外信号 4714397,错误 0,代码 370078816”。有谁知道我在哪里可以找到这些号码对应的 map ? sig
我的程序有一个受 epoll 约束的事件循环(用于 I/O)和条件变量(用于其他消息事件),以及负责捕获信号的工作线程(SIGINT、SIGTERM、SIGHUP)。 SIGINT , SIGTERM
我正在尝试学习如何使用 sigtimedwait(),但我发现它并没有等待超时完成。下面它似乎比它应该更快地返回 EAGAIN 4 秒(每 1 分钟超时快 1 秒): #include #inclu
我最近一直在研究 Linux 上的信号处理,并阅读了所有与信号处理相关的概念。一个困扰我的问题是,为什么在进程畅通无阻时,sigtimedwait() 集合中的信号没有被传递。我的代码如下:- #in
我在 sigtimedwait () 发生崩溃,一旦在运行无限时间的线程函数中运行下面所述的代码块。在运行于 debian 9.3 上的应用程序中使用 sigtimedwait 来查找 SIGUSR1
我在 FreeBSD 上使用 sigtimedwait() 捕获 SIGCHLD 信号时遇到问题。以下源代码在 Debian GNU/Linux 7 上运行良好,但为我提供了在 FreeBSD 9.1
我是一名优秀的程序员,十分优秀!