【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);
     }
    
 .....

 

posted @ 2023-08-09 10:25  FBshark  阅读(20)  评论(0编辑  收藏  举报