举例说明C语言中sigaction函数的使用

1,038 阅读5分钟

sigaction()是一个允许调用/观察或检查与特定信号相关的特定动作的函数。人们认为将信号和sigaction函数放在同一页上。但在现实中,这并没有发生。在当前处理程序的执行过程中,signal()函数不会阻塞其他信号。同时,sigaction函数可以阻止其他信号,直到当前处理程序返回。

语法

#include <signal.h>
# int sigaction(int sig, const struct sigaction *__restrict__ new, struct sigaction *__restrict__ old);

sigaction函数检查与特定信号相关的动作。我们现在讨论的是sigaction函数参数中的参数。第一个是int 'sig',从数据类型可以看出,它是一个数字,指的是已经被识别的信号。sigaction函数设置动作并将其与信号联系起来。所用的sig参数必须在<signal.h>库中。

Constant struct sigaction是一个指针,它首先被指为NULL居多。如果是这样,那么sigaction函数就会检查当前定义的处理sig的动作。这将不会修改或取消这个动作。而如果新的指针没有被指为NULL值,它将指向一个sigaction结构。然后,在sigaction结构中具体确定的动作就成为与sig相关的新动作。

第三个参数是struct sigaction *old,它指出了sigaction函数存储sigaction结构的内存地址。sigaction函数使用这个内存地址来存储描述当前与sig相关的活动的结构。old值可以是一个NULL值;在这种情况下,sigaction结构不会被存储为信息。

Sigaction结构

现在我们来谈一谈sigaction结构。

这里提到了该结构中存在的成员。

Void (*) (int) sa_handler

它是一个函数的指针,处理向它发出的信号。这个功能的值可以显示默认的动作,或者表示要忽略的信号。

Sigset_t mask

我们不能使用阻断任何信号的机制,如果sa_mask已经使用了阻断信号,这些信号将被忽略。sigaction()函数不会返回任何错误。

Int sa_flags

有很多标志会影响信号的行为。这里解释了其中的一些。

_Sa_ignore

这是唯一的输出,任何应用程序都不能指定它。

Sa-restart

它告诉系统,如果被信号打断,就会得到库中的重启函数。应用这个重启函数的函数是那些被定义为要被信号打断,然后将errno设置为EINTR的函数,即accept()、pause()、close()和big pause()是那些如果被信号打断就可以重启的函数。

SA_SIGINFO

这个特性告诉系统使用sa_sigaction指定的信号动作,而不是sa_handler。当该标志关闭时,动作受到信号的影响,那么由sa_handler指定的信号处理函数将作为一个无效函数被调用(int signo);这里,signo包含系统产生的信号编号。

SA_SIGACTION

是一个指针,指向指定的处理信号的函数。这个函数包含三个参数。第一个包括一个类型为整数的参数,包含要被调用的函数的信号。第二个参数是一个指针型的siginfo_t;它包含关于信号源的额外信息。第三个是'指向void的指针'。

sigaction函数的实现

我们在Linux操作系统中实现了sigaction代码。使用文本编辑器编写C语言编程的源代码;对于结果值的输出,使用Ubuntu终端通过GCC编译器进行编译。这样编译后就可以执行代码了。

例子1

这个例子包含了一个库和.NET的列表。 在这个例子中,使用了一个信号掩码,并用sigaction()设置,以不调用其他处理程序,特别是在使用单一处理程序时。信号处理程序函数包含signo作为一个参数。

进程ID显示在主程序中,以确保工作。Sigaction是一个描述信号处理程序的结构。这就是信号处理程序被它所包含的原因。一个信号掩码被用来表明当信号处理函数在执行时,应该有一个信号的阻塞。现在,当一个指定的信号发生时,指定信号处理函数。

# struct sigaction act;
# act.sa.handler = $sighandler;

之后,所有的信号都被添加到信号屏蔽集。当信号处理函数运行时,所有的信号将被屏蔽。当我们的信号处理程序通常存在时,它会恢复原来的信号屏蔽。SA_RESTART将恢复该函数。一个信号处理程序被添加到SIGINT中。

写完代码后,用Ubuntu终端中的编译器进行编译。"Sig.c "是一个文件的名称。

$ gcc –o sig. c
$./sig

执行后,你可以看到首先显示的是进程ID,其信号需要被阻断。显示的信息意味着该函数将返回一个正值。

例子2

现在考虑另一个例子,在这个例子中,第一部分决定了SIGCHLD信号目前是否被忽略。使用一个NULL指针作为新的参数,当前的信号处理程序不会被改变。主程序中包含了使用sigaction函数的if语句;如果返回值为-1,说明子程序被忽略了。而在另一个部分,如果返回值是信号本身。这意味着该子程序被默认。

在执行时,你会看到子程序默认了。

示例3

这个例子包含了与第二个例子相同的功能,但也增加了一些额外的功能。比如在这个函数中通过sigaction添加了一个新的处理程序。

总结

Sigaction函数的使用 "这篇文章包含了函数的工作原理和它的参数的详细描述。Sigaction在阻止那些不被识别或来自黑客的信号方面起着重要作用。这就是为什么大多数程序员喜欢在程序中使用sigaction函数。SA_FLAG是sigaction函数的一个重要参数,所以我们已经解释了一些重要的标志和基本功能。Linux操作系统在实现C语言编程中的sigaction函数方面发挥了重要作用。本指南的目的是解释sigaction的功能和旨在针对接近它的信号的结构。