在linux的信号处理c

在linux的信号处理c,第1张

概述在linux的信号处理c

我试图从我在网上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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1284113.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存