🗨️信号
00 min
2024-11-27
2024-12-11
type
status
summary
date
slug
tags
category
icon
password
1.系统调用
kil函数用于给进程传递信号
int kill(p_id pid,int signal);
2.封装函数
raise(int signal)发送一个信号给调用者;
3.abort函数
中止进程
4.
不能=被进程捕捉的信号:-9(kil)-19(stop)
5.
捕捉信号signal函数第一个参数是信号编号,第二个参数是一个函数指针这个函数必须要有一个参数是int类型的然后通过函数指针传入,传入之后signal函数能将信号编号传给该函数并且调用
但是9号信号和19号编号不能被捕捉
调用函数abrot函数(6)号信号不会被捕捉
 

sigset_t

在C语言中,sigset_t 是一个数据类型,用于表示信号集(signal set)。信号集是一个集合,包含了一组信号值,通常用于信号处理函数中,如 sigprocmasksigpendingsigsuspend 等,来指定哪些信号被阻塞、哪些信号是未决的,或者哪些信号应该被处理。
sigset_t 类型通常是一个位集合(bit set),其中的每个位对应一个信号。当某一位被设置为1时,表示相应的信号在集合中;当设置为0时,表示信号不在集合中。
以下是一些常用于操作 sigset_t 类型的基本宏和函数:
  1. sigemptyset(sigset_t *set):初始化一个空的信号集,即集合中不包含任何信号。
  1. sigfillset(sigset_t *set):初始化一个信号集,使其包含所有可能的信号。
  1. sigaddset(sigset_t *set, int signum):向信号集中添加一个指定的信号。
  1. sigdelset(sigset_t *set, int signum):从信号集中删除一个指定的信号。
  1. sigismember(const sigset_t *set, int signum):检查指定的信号是否是信号集的成员。
这些操作允许程序员对信号集进行灵活的操作,以控制程序对信号的响应。例如,可以创建一个信号集来阻塞某些信号,然后在需要的时候修改这个信号集,或者检查某个信号是否被阻塞。
sigset_t 类型的具体实现可能因编译器和操作系统的不同而有所差异,但它提供了一个统一的接口来处理信号集。在使用这些宏和函数时,需要包含头文件 <signal.h>
 
 
 
 

2.sigprocmask

 
sigprocmask 函数是 C 语言中用于检查或修改当前进程的信号屏蔽字(signal mask)的函数。信号屏蔽字决定了在屏蔽期间哪些信号会被阻塞,即暂时不会被处理。以下是 sigprocmask 函数的一些常用用法:

函数原型

参数

  • int how:操作标志,决定如何修改信号屏蔽字:
    • SIG_BLOCK:把 set 指向的信号集中的信号添加到当前信号屏蔽字中。
    • SIG_UNBLOCK:从当前信号屏蔽字中移除 set 指向的信号集中的信号。
    • SIG_SETMASK:用 set 指向的信号集替换当前信号屏蔽字。
  • const sigset_t *set:指向要修改的新信号集的指针。
  • sigset_t *oldset:如果不为 NULL,则存储之前的信号屏蔽字。

返回值

  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno 以指示错误类型。

常用用法

  1. 阻塞信号:使用 SIG_BLOCK 将指定的信号添加到当前的信号屏蔽字中,从而阻塞这些信号。
    1. 这段代码会阻塞 SIGINT 信号(通常由 Ctrl+C 发送)。
  1. 解除信号阻塞:使用 SIG_UNBLOCK 从当前信号屏蔽字中移除指定的信号集,从而解除对这些信号的阻塞。
    1. 这段代码会解除对 SIGINT 信号的阻塞。
  1. 设置信号屏蔽字:使用 SIG_SETMASK 替换当前的信号屏蔽字为指定的信号集。
    1. 这段代码会将当前的信号屏蔽字设置为 new_mask 中指定的信号集。
  1. 获取当前信号屏蔽字:如果 oldset 参数不为 NULL,则 sigprocmask 函数会将当前的信号屏蔽字存储在 oldset 指向的变量中。
    1. 这段代码会获取当前的信号屏蔽字并存储在 oldset 中。

注意事项

  • sigprocmask 函数只为单线程的进程定义的,在多线程中要使用 pthread_sigmask 函数。
  • 使用 sigprocmask 时,需要包含头文件 <signal.h>
通过这些用法,你可以控制进程对特定信号的响应,这对于信号处理和多线程编程是非常重要的。
 
 
sigprocmask 函数是 C 语言中用于检查或修改当前进程的信号屏蔽字(signal mask)的函数。信号屏蔽字决定了在屏蔽期间哪些信号会被阻塞,即暂时不会被处理。以下是 sigprocmask 函数的一些常用用法:

函数原型

参数

  • int how:操作标志,决定如何修改信号屏蔽字:
    • SIG_BLOCK:把 set 指向的信号集中的信号添加到当前信号屏蔽字中。
    • SIG_UNBLOCK:从当前信号屏蔽字中移除 set 指向的信号集中的信号。
    • SIG_SETMASK:用 set 指向的信号集替换当前信号屏蔽字。
  • const sigset_t *set:指向要修改的新信号集的指针。
  • sigset_t *oldset:如果不为 NULL,则存储之前的信号屏蔽字。

返回值

  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno 以指示错误类型。

常用用法

  1. 阻塞信号:使用 SIG_BLOCK 将指定的信号添加到当前的信号屏蔽字中,从而阻塞这些信号。
    1. 这段代码会阻塞 SIGINT 信号(通常由 Ctrl+C 发送)。
  1. 解除信号阻塞:使用 SIG_UNBLOCK 从当前信号屏蔽字中移除指定的信号集,从而解除对这些信号的阻塞。
    1. 这段代码会解除对 SIGINT 信号的阻塞。
  1. 设置信号屏蔽字:使用 SIG_SETMASK 替换当前的信号屏蔽字为指定的信号集。
    1. 这段代码会将当前的信号屏蔽字设置为 new_mask 中指定的信号集。
  1. 获取当前信号屏蔽字:如果 oldset 参数不为 NULL,则 sigprocmask 函数会将当前的信号屏蔽字存储在 oldset 指向的变量中。
    1. 这段代码会获取当前的信号屏蔽字并存储在 oldset 中。

注意事项

  • sigprocmask 函数只为单线程的进程定义的,在多线程中要使用 pthread_sigmask 函数。
  • 使用 sigprocmask 时,需要包含头文件 <signal.h>
通过这些用法,你可以控制进程对特定信号的响应,这对于信号处理和多线程编程是非常重要的。
 
 

3.sigpending

sigpending 函数是 C 标准库中的一个函数,用于获取当前进程挂起(未决)的信号集。未决信号是在被阻塞后尚未处理的信号。此函数定义在 <signal.h> 头文件中。

函数原型

参数

  • sigset_t *set:指向一个 sigset_t 类型的变量,该变量将被填充为当前进程的未决信号集。

返回值

  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno 以指示错误类型。

功能描述

sigpending 函数用于获取当前进程所有未决的信号。通过其 set 参数返回未决的信号集。调用成功则返回0,出错则返回-1。

实例

以下是一个使用 sigpending 函数获取当前进程未决信号集的示例程序。该程序阻塞 SIGINT 信号,然后发送该信号,并使用 sigpending 检查该信号是否在未决信号集中。
编译并运行程序后,输出将是:
程序首先阻塞 SIGINT 信号,然后发送该信号,并使用 sigpending 检查 SIGINT 是否在未决信号集中。最后,程序恢复原来的信号屏蔽字,并捕捉到 SIGINT 信号,执行信号处理程序。
 
 

4.sigismember

sigismember 是一个宏,用于检查一个特定的信号是否是信号集中的成员。这个宏定义在 C 语言的标准库 <signal.h> 中,是信号处理中常用的一个函数式宏。

函数原型

参数

  • const sigset_t *set:指向信号集的指针,该信号集可能包含多个信号。
  • int signum:要检查的信号的编号。

返回值

  • 返回 1(真),如果 signum 指定的信号是信号集 set 的成员。
  • 返回 0(假),如果 signum 指定的信号不是信号集 set 的成员。
  • 如果发生错误,返回 1 并设置 errno 以指示错误类型。

功能描述

sigismember 宏用于检查信号集 set 中是否包含特定的信号 signum。如果信号在集合中,宏返回非零值;如果不在集合中,返回零。

示例代码

在这个示例中,首先使用 sigfillset 函数初始化一个包含所有信号的信号集,然后使用 sigismember 宏检查 SIGINT 信号是否在信号集中。接着,使用 sigdelset 函数从信号集中移除 SIGINT 信号,并再次使用 sigismember 宏进行检查。
 
 
 

5.sigaction函数

sigaction 是一个在 Unix 和类 Unix 操作系统中使用的系统调用,用于设置或检索信号处理器。它提供了比传统的 signal 函数更灵活的信号处理机制。sigaction 允许你指定一个信号处理函数,以及信号被发送时的行为,包括忽略信号或者执行一个信号处理函数。
函数原型如下:
参数说明:
  • sig:指定要操作的信号。
  • act:指向 sigaction 结构体的指针,该结构体定义了信号的处理行为。
  • oldact:可选参数,指向一个 sigaction 结构体,用于存储信号的旧处理行为。
sigaction 结构体定义如下:
  • sa_handler:信号处理函数,当信号发生时被调用。
  • sa_sigaction:一个更高级的信号处理函数,可以接收额外的参数。
  • sa_mask:在信号处理函数执行期间,该信号集内的信号将被阻塞。
  • sa_flags:指定信号处理的行为,比如是否自动重启被信号中断的系统调用等。
  • sa_restorer:已废弃,不再使用。
返回值:
  • 成功时,sigaction 返回 0。
  • 失败时,返回 -1,并设置 errno 以指示错误。
使用 sigaction 时,你可以指定信号处理函数的行为,比如是否忽略信号,或者是否在信号处理函数执行完毕后自动重启被中断的系统调用。这使得 sigactionsignal 更灵活和可靠。
上一篇
进程间通信
下一篇
基础IO