【Linux 应用开发】信号的产生和处理的设置
内容来自正点原子文档
信号的产生:
方式1: Shell 命令
kill 命令,Ctrl+C 或者 Ctrl+\
方式2:使用系统调用 kill()
#include <sys/types.h>
#include <signal.h>
/**
@pid:要发送的进程号
@signum:参数signum指定需要发送的信号编号,也可设置为0,如果参数sig设置为0则表示不发送信号,但任执行错误检查,这通常可用于检查参数pid指定的进程是否存在。
*/
int kill(pid_t pid, int signum);
方式3: 使用系统调用 raise()
#include <signal.h>
//向自身进程发送信号,等价于 kill(getpid(), sig);
int raise(int sig);
方式4:使用alarm()函数
可以设置一个定时器(闹钟),当定时器定时时间到时,内核会向进程发送SIGALRM信号 (注意:非循环触发)
#include <unistd.h>
//相当于 kill(getpid(), SIGALRM)
unsigned int alarm(unsigned int seconds);
方式5:使用pause()函数
pause()系统调用可以使得进程暂停运行、进入休眠状态,直到进程捕获到一个信号为止,只有执行了信号处理函数并从其返回时,pause()才返回。
#include <unistd.h>
int pause(void);
方式6:发送队列管理的实时信号(可靠信号)
#include <signal.h>
int sigqueue(pid_t pid, int sig, const union sigval value);
//携带的伴随数据
typedef union sigval {
int sival_int;
void *sival_ptr; }
sigval_t;
信号的处理的设置:
信号有三种处理方式,忽略、用户自定义、系统默认处理方式。
程序员可以通过下面一系列函数指定处理方式:
1. signal()
#include <signal.h>
typedef void (*sig_t)(int);
sig_t signal(int signum, sig_t handler);
//signum 为信号编号
//handler 为处理方式,可为用户自定义的函数或以下参数
#define SIG_ERR ((sig_t) -1) /* Error return. */
#define SIG_DFL ((sig_t) 0) /* Default action. */
#define SIG_IGN ((sig_t) 1) /* Ignore signal. */
2. sigaction()
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
sigaction() 使用举例:父进程通过信号回收结束的子进程
static void wait_child(int sig)//信号处理函数
{
/* 替子进程收尸 */
printf("父进程回收子进程\n");
while (waitpid(-1, NULL, WNOHANG) > 0)
continue;
}
int main()
{
struct sigaction sig = {0};
sigemptyset(sig.sa_mask);
sig.sa_handler = wait_child;
sig.sa_flags = 0;
if (-1 == sigaction(SIGCHLD, &sig, NULL)) /* 为 SIGCHLD 信号绑定处理函数 */
{
perror("sigaction error");
exit(-1);
}
.....
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具