我用C编写了一个简单的守护进程,运行在Linux上。我在试着了解如何正确设置信号掩码。我的守护进程中有以下代码:
struct sigaction new_sig_action;
sigset_t new_sig_set;
/* Set signal mask - signals we want to block */
sigemptyset(&new_sig_set);
sigaddset(&new_sig_set, SIGCHLD); /* ignore child - i.e. we don't need to wait for it */
sigaddset
我正在Linux上编写一个C程序,其中我有一个main()和两个由它创建的线程。在其中一个p线程中,我调用了accept()函数。
我有一个信号处理程序,它在接收到SIGINT、SIGQUIT或SIGTERM时被调用。
我的期望是,因为我正在使SA_RESTART标志为零,当我按ctrl-c时,accept()函数应该返回EINTR而不是重新启动,但是我在调试过程中通过一系列printf调用(通过打印代码所在的位置来查看执行哪些行)认识到,即使我的应用程序能够捕获SIGINT,接受函数仍然被阻塞,它在EINTR中没有失败,也没有移动到下一行代码。以下是main()内部的设置
struct si
struct sigaction:
struct sigaction {
void (*sa_handler)(int); /* addr of signal handler, */
/* or SIG_IGN, or SIG_DFL */
sigset_t sa_mask; /* additional signals to block */
int sa_flags; /* signal opti
以这个简单的例子为例:
public class Main
{
public static void main(String[] args) throws Exception
{
Runtime.getRuntime().exec("sleep 1000");
// This is just so that the JVM does not exit
Thread.sleep(1000 * 1000);
}
}
我正在使用openjdk6在Linux上运行这个程序。如果我试图向“睡眠”进程发送一个SIGQ
我想确切地知道异步信号处理程序在Linux上是如何执行的。首先,我不清楚哪个线程执行信号处理程序。其次,我想知道让线程执行信号处理程序所遵循的步骤。
关于第一个问题,我读到了两种不同的、似乎相互矛盾的解释:
The Linux Kernel,作者: Andries Brouwer,:
当信号到达时,进程中断,保存当前寄存器,并调用信号处理程序。当信号处理程序返回时,中断的活动将继续。
让我认为Linux的行为是:
当一个信号被传递到一个进程时,如果它被捕获了,它将由一个且只有一个满足以下条件的线程来处理:
1. A thread blocked in a [**sigwait**(2)](h
我用多个进程编写了一个程序,每个进程都有多个线程。我想使用ctrl停止程序,并决定使用中断处理程序。为此,在按下ctrl时,我使用signal()函数设置了一个标志。大多数线程都包含没有阻塞语句的循环,只是在未设置标志时运行。设置标志时,循环结束,调用pthread_exit()。一些线程包含一个阻塞语句,并且可能不会到达注意到标志更改和循环可能结束的地步。
在下面的示例中,这将导致内存泄漏(malloc()而没有空闲())和进程没有正确结束。
我检查了许多问题,但没有找到适当的解决办法。任何帮助都将不胜感激!
我在下面添加了一个示例(伪代码):
int flag = 0;
int main
假设有两个进程,一个父进程和一个子进程,它们使用该信号进行同步。在父进程中,用于与子进程同步的函数如下。
WAIT_CHILD(){
while(sigflag == 0){ //sigflag will be set to 1 in a signal handler in the child process
sigsuspend(&zeromask); //No signal is in the mask set
}
//do sth....
}
我的问题是,我们是否可以使用pause()来取代sigsuspend(&zeromask)