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)。信号集是一个集合,包含了一组信号值,通常用于信号处理函数中,如 sigprocmask
、sigpending
和 sigsuspend
等,来指定哪些信号被阻塞、哪些信号是未决的,或者哪些信号应该被处理。sigset_t
类型通常是一个位集合(bit set),其中的每个位对应一个信号。当某一位被设置为1时,表示相应的信号在集合中;当设置为0时,表示信号不在集合中。以下是一些常用于操作
sigset_t
类型的基本宏和函数:sigemptyset(sigset_t *set)
:初始化一个空的信号集,即集合中不包含任何信号。
sigfillset(sigset_t *set)
:初始化一个信号集,使其包含所有可能的信号。
sigaddset(sigset_t *set, int signum)
:向信号集中添加一个指定的信号。
sigdelset(sigset_t *set, int signum)
:从信号集中删除一个指定的信号。
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
以指示错误类型。
常用用法
- 阻塞信号:使用
SIG_BLOCK
将指定的信号添加到当前的信号屏蔽字中,从而阻塞这些信号。
这段代码会阻塞
SIGINT
信号(通常由 Ctrl+C 发送)。- 解除信号阻塞:使用
SIG_UNBLOCK
从当前信号屏蔽字中移除指定的信号集,从而解除对这些信号的阻塞。
这段代码会解除对
SIGINT
信号的阻塞。- 设置信号屏蔽字:使用
SIG_SETMASK
替换当前的信号屏蔽字为指定的信号集。
这段代码会将当前的信号屏蔽字设置为
new_mask
中指定的信号集。- 获取当前信号屏蔽字:如果
oldset
参数不为NULL
,则sigprocmask
函数会将当前的信号屏蔽字存储在oldset
指向的变量中。
这段代码会获取当前的信号屏蔽字并存储在
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
以指示错误类型。
常用用法
- 阻塞信号:使用
SIG_BLOCK
将指定的信号添加到当前的信号屏蔽字中,从而阻塞这些信号。
这段代码会阻塞
SIGINT
信号(通常由 Ctrl+C 发送)。- 解除信号阻塞:使用
SIG_UNBLOCK
从当前信号屏蔽字中移除指定的信号集,从而解除对这些信号的阻塞。
这段代码会解除对
SIGINT
信号的阻塞。- 设置信号屏蔽字:使用
SIG_SETMASK
替换当前的信号屏蔽字为指定的信号集。
这段代码会将当前的信号屏蔽字设置为
new_mask
中指定的信号集。- 获取当前信号屏蔽字:如果
oldset
参数不为NULL
,则sigprocmask
函数会将当前的信号屏蔽字存储在oldset
指向的变量中。
这段代码会获取当前的信号屏蔽字并存储在
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
时,你可以指定信号处理函数的行为,比如是否忽略信号,或者是否在信号处理函数执行完毕后自动重启被中断的系统调用。这使得 sigaction
比 signal
更灵活和可靠。- Author:PytC
- URL:https://PytC.fun//article/14b49b4c-fd33-80f5-a692-ef6add1c6837
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!