我试图从我在网上find的示例程序来了解linux中的信号是如何工作的,但是它有一些我不太了解的部分。
这是我的示例程序:
#include <signal.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> voID catcher(int sig) { printf("catcher() has gained controln"); } int main(int argc,char *argv[]) { struct sigaction sigact; sigset_t sigset; sigemptyset(&sigact.sa_mask); sigact.sa_flags = 0; sigact.sa_handler = catcher; sigaction(SIGUSR1,&sigact,NulL); printf("before first kill()n"); kill(getpID(),SIGUSR1); sigemptyset(&sigset); sigaddset(&sigset,SIGUSR1); sigprocmask(SIG_SETMASK,&sigset,NulL); printf("before second kill()n"); kill(getpID(),SIGUSR1); printf("after second kill()n"); return 0; }
以下是我的程序的输出示例:
第一次杀之前()
捕手()已经获得控制
之前第二次杀()
第二次杀人后()
Longjmp出信号处理程序?
处理多个SIGCHLD
在c静态库中使用定时器/信号不好的做法?
SignalR可以用来从控制台应用程序发送一个消息,将显示在浏览器中?
为什么由bash脚本启动的进程在terminalclosures后不会退出?
我可以知道为什么输出中的第一行是before first kill() ? 为什么catcher() has gained control呢?
据我所知, sa_handler包含两种types的信号,信号默认和信号忽略。
我们如何知道它会产生哪个信号? 为什么它会触发函数打印捕获器()已经获得控制,如果信号忽略被生成?
另外,这个程序中的sa_mask函数是什么? 在我的理解中, sa_mask会阻止指定的信号。
芹菜任务超时/窗口的时间限制?
从自定义系统调用生成段错误
为什么我的linux信号处理程序对信号没有反应?
sigaction信号处理程序中的分段错误
sig_atomic_t如何实际工作?
我可以知道为什么输出中的第一行是在第一个kill()之前? 为什么捕手()没有获得控制权呢?
你安装了一个捕获SIGUSR1的信号处理程序。 在SIGUSR1交付给进程之前,正常的程序执行流程不断发生。 所以在这里:
printf("before first kill()n"); kill(getpID(),SIGUSR1);
before first kill()你只能在打印后生成信号before first kill() 。 为什么你不期望这个在catcher() has gained control之前出现? 换句话说,当你调用printf("before first kill()n"); ,没有信号产生,所以你只能期望程序执行保持正常。
这一行:
kill(getpID(),SIGUSR1);
生成SIGUSR1 。 *** 作系统在方便的时候将信号传递给过程。 由于您为SIGUSR1安装了一个处理程序,因此您的信号处理程序( catcher() )被调用。 在打印完第一行之后,您会提高信号,因此可以预期下一行输出将来自信号处理程序。
请注意, printf(3)不是异步信号安全的,所以在技术上你不能从信号处理程序中调用它,但通常这些玩具的例子是可以的。
据我所知,sa_handler包含两种类型的信号,信号默认和信号忽略。
除此之外还有更多。 struct sigaction的sa_handler字段可以具有值SIG_DFL ,其对应于默认信号动作(默认动作在man signal列出)和SIG_IGN ,这意味着信号被忽略(当引发时没有任何反应)。 但sa_handler也可以是一个函数的指针,每次传递信号时都要调用它。 这就是你所显示的代码是在做什么 – 这是说: 嗨,当SIGUSR1交付时,请致电catcher() 。
我们如何知道它会产生哪个信号? 为什么它会触发函数打印捕获器()已经获得控制,如果信号忽略被生成?
您在调用sigaction(2)来设置处理程序时指出了一个信号( SIGUSR1 )。 所以,当SIGUSR1被传送时, catcher()将被调用。
另外,这个程序中的sa_mask函数是什么? 在我的理解中,sa_mask会阻止指定的信号。
这是一个信号掩码,它在进入信号处理程序时以原子方式安装,并在信号处理程序返回时被卸载。 默认情况下,即使你传递了一个空的掩码,进入处理程序时被捕获的信号总是被阻塞(除非在struct sigaction的sa_flags字段中设置了SA_NODEFER标志)。 但是,在处理程序正在执行时,您可能想要阻止其他信号 – 这种方式通过在sa_mask指示这些信号来sa_mask 。
总结以上是内存溢出为你收集整理的在linux的信号处理c全部内容,希望文章能够帮你解决在linux的信号处理c所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)