linux-sys_信号

来源:互联网 发布:程序员的简历怎么写 编辑:程序博客网 时间:2024/05/17 03:16

##信号编号

kill -l

##信号机制

man 7 signal

##信号产生的种类

ctrl + c  SIGINT

ctrl + z  SIGTSTP

ctrl + \  SIGQUIT


int kill(pid_t pid, int sig)
pid > 0
sig发送给ID为pid的进程
pid == 0
sig发送给与发送进程同组的所有进程
pid <
0
sig发送给组ID为|-pid|的进程,并且发送进程具有向其发送信号的权限
pid == -1
sig发送给发送进程有权限向他们发送信号的系统上的所有进程
sig为0时,用于检测,特定为pid进程是否存在,如不存在,返回-1。


进程处理信号行为:

1.默认处理动作(term、core、ign、stop、cont)

2.忽略

3.捕捉(用户自定义信号处理函数)


PCB里面有两个信号集:PEND未决信号集合、 Block阻塞信号集(信号屏蔽字)

递达态:信号产生并且被相应

未决态:信号产生,没有被相应


信号集处理函数:

sigset_t为信号集,可sizeof(sigset_t)察看
int sigemptyset(sigset_t *set)
int sigfillset(sigset_t *set)
int sigaddset(sigset_t *set, int signo)
int sigdelset(sigset_t *set, int signo)
int sigismember(const sigset_t *set, int signo)


调用函数sigprocmask可以读取或更改进程的信号屏蔽字。
#include <signal.h>
int sigprocmask(int how, const sigset_t *set, sigset_t *oset);
返回值:若成功则为0,若出错则为-1

how参数的含义
SIG_BLOCK
set包含了我们希望添加到当前信号屏蔽字的信号,相当于mask=mask|set
SIG_UNBLOCK set包含了我们希望从当前信号屏蔽字中解除阻塞的信号,相当于mask=mask&~set
SIG_SETMASK 设置当前信号屏蔽字为set所指向的值,相当于mask=set


#include <signal.h>
int sigpending(sigset_t *set);
sigpending读取当前进程的未决信号集,通过set参数传出。调用成功则返回0,出错则
返回-1。



#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
struct sigaction 定义:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t

{
int
void
sa_mask;
sa_flags;
(*sa_restorer)(void);
};
sa_handler : 早期的捕捉函数

sa_sigaction : 新添加的捕捉函数,可以传参 , 和sa_handler互斥,两者通过sa_flags选择采用哪种捕捉函数
sa_mask : 在执行捕捉函数时,设置阻塞其它信号,sa_mask | 进程阻塞信号集,退出捕捉函数后,还原回原有的
阻塞信号集
sa_flags :
SA_SIGINFO 或者 0
sa_restorer : 保留,已过时


C标准库信号处理函数
typedef void (*sighandler_t)(int)
sighandler_t signal(int signum, sighandler_t handler)
int system(const char *command)
集合fork,exec,wait一体


可重入和时序竞态的概念