- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
如果我为 SIGABRT 设置和发出信号处理程序,同时我有一个线程在 sigwait() 上等待 SIGABRT 到来(我在其他线程中有一个被 pthread_sigmask 阻塞的 SIGABRT)。
那么先处理哪一个呢?信号处理程序或 sigwait() ?
[我面临一些问题,sigwait() 永远被阻止。我目前正在调试它]
main()
{
sigset_t signal_set;
sigemptyset(&signal_set);
sigaddset(&signal_set, SIGABRT);
sigprocmask(SIG_BLOCK, &signal_set, NULL);
// Dont deliver SIGABORT while running this thread and it's kids.
pthread_sigmask(SIG_BLOCK, &signal_set, NULL);
pthread_create(&tAbortWaitThread, NULL, WaitForAbortThread, NULL);
..
Create all other threads
...
}
static void* WaitForAbortThread(void* v)
{
sigset_t signal_set;
int stat;
int sig;
sigfillset( &signal_set);
pthread_sigmask( SIG_BLOCK, &signal_set, NULL ); // Dont want any signals
sigemptyset(&signal_set);
sigaddset(&signal_set, SIGABRT); // Add only SIGABRT
// This thread while executing , will handle the SIGABORT signal via signal handler.
pthread_sigmask(SIG_UNBLOCK, &signal_set, NULL);
stat= sigwait( &signal_set, &sig ); // lets wait for signal handled in CatchAbort().
while (stat == -1)
{
stat= sigwait( &signal_set, &sig );
}
TellAllThreadsWeAreGoingDown();
sleep(10);
return null;
}
// Abort signal handler executed via sigaction().
static void CatchAbort(int i, siginfo_t* info, void* v)
{
sleep(20); // Dont return , hold on till the other threads are down.
}
在 sigwait() 处,我将知道已收到 SIGABRT。我会告诉其他线程。然后将持有中止信号处理程序,以便进程不会终止。
我想知道 sigwait() 和信号处理程序的交互。
最佳答案
来自 sigwait()
文档:
The sigwait() function suspends execution of the calling thread until one of the signals specified in the signal set becomes pending.
挂起信号是指等待传递给线程/进程之一的阻塞信号。因此,您需要不要像您对pthread_sigmask(SIG_UNBLOCK, &signal_set, NULL)
调用那样解锁信号。
这应该有效:
static void* WaitForAbortThread(void* v){
sigset_t signal_set;
sigemptyset(&signal_set);
sigaddset(&signal_set, SIGABRT);
sigwait( &signal_set, &sig );
TellAllThreadsWeAreGoingDown();
sleep(10);
return null;
}
关于c - sigwait() 和信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21552600/
我正在尝试编写一个多线程程序,其中一个线程(下面的可变线程)负责可能设置为此进程的任何异步信号。 我面对使用sigwait()但不响应已发送给进程的任何信号的线程。 (例如下面的SIGUSR1)。 s
我正在使用 sigwait 为某些信号阻塞我的线程。这些信号已添加到信号集中。根据 doc sigwait 应该只等待作为参数中的一组传递给它的信号,并且不应该更改该线程的信号掩码。但是出于某种我不知
如果我为 SIGABRT 设置和发出信号处理程序,同时我有一个线程在 sigwait() 上等待 SIGABRT 到来(我在其他线程中有一个被 pthread_sigmask 阻塞的 SIGABRT)
sigwait() 的手册页让我很困惑。 sigwait 的签名是 int sigwait(const sigset_t *set, int *sig); 假设我有类似于以下的代码 sigset_
在这种情况下,我有多个进程 3、1 个父进程和 2 个子进程。我希望每个 child 从他们的信号处理程序返回后继续。但有时它们会卡住,有时只有其中一个会继续。我的错误是什么?实际上我正在尝试做一些类
我在我的代码中做错了,其他进程向它发送了一个 SIGUSR2 信号: sigset_t sigset; sigemptyset(&sigset); sigaddset(&sigset, SIGILL)
我有一个主应用程序生成一个单独的线程来处理队列外的消息。当我按下 CTRL-C 时,我在 AIX 上遇到问题,因为它似乎使线程中的某些“连接句柄”变得无效。我在主程序中确实有一个捕获 SIGINT 的
我发现使用 posix pthread/signaling api 的两个线程之间的信号不一致。 这是我的测试程序 #include #include #include #include #i
我正在编写一个需要用以下 bash 行终止的多线程程序: killall -QUIT -w procname 我决定使用一个线程来接收一些我需要处理的信号,比如 SIGQUIT 和 SIGUSR1,而
在程序中,SIGCHLD 被主线程阻塞,然后 线程“THREAD_1”正在执行 sigwait(), 线程“THREAD_2” fork 一个子进程并杀死它,在这个线程中我调用了 pthread_si
我正在编写一个程序,它从一个文件中获取一系列 UNIX 命令并按顺序执行它们。为了保持一切有序,我必须初始化每个命令并通过 sigwait() 等待 SIGUSR1。当每个命令都初始化后,每个命令都可
在多线程应用程序中,所有线程都会阻塞所有信号,并且单个线程在循环中使用 sigwait 进行信号处理。 .现在我们应该考虑 EINTR使用系统调用后,如 read和 write在其他线程? while
引用 http://man7.org/linux/man-pages/man3/pthread_sigmask.3.html 提供的代码在程序源部分下。 对该代码的更改为:1) SIGVTALRM 被
#include #include #include #include #include #include #include #include #define NUM_THREADS
有两个实时线程。第一个具有低优先级,它正在等待 sigwait() 中所有可能的信号(因此所有信号都被阻止并且传递给该函数的 sigmask 已启用所有信号)。第二个具有高优先级并向第一个(低优先级)
假设我有一个不阻塞任何信号的多线程应用程序,并且一个线程调用 sigwait() 并使用 SIGTERM 的掩码。如果进程从外部接收到SIGTERM,是否可以保证以下任一情况? 在 sigwait()
我发现以下代码在 macOS 和 Linux 中的工作方式不同: #include #include #include void catcher( int sig ) { printf(
考虑一个由多个工作线程组成的并行程序。这些线程在某些文件描述符上有一个 poll 循环。该程序应该一直运行到按下 ctrl-c/进程接收到 SIGINT。该程序不应在不必要的情况下唤醒。 我设计了以下
我正在从事一个 C/C++ 网络项目,但在同步/向我的线程发送信号时遇到困难。这是我想要完成的: 使用轮询函数轮询一组套接字 如果 POLLIN 事件中有任何套接字准备就绪,则向读取器线程和写入器线程
我正在寻找一个多线程应用程序,其中一个线程在继续之前等待另一个线程发出信号。根据here , sigsuspend 由于竞争条件不是 MT 安全的。根据here , sigwait 应该在这些情况下使
我是一名优秀的程序员,十分优秀!