标签:table 信号 ISE apt struct restart ati 产生 gac
一、基本概念
1、中断分为软件中断和硬件中断
2、信号是一种软件中断,是进程与进程,进程与内核的一种通信方式
SIGINT(2) |
中断中断信号Ctrl+c |
SIGQUIT(3) | 终端退出信号Ctrl+\ |
SIGABRT(6) | 调用abort函数产生的信号 |
SIGFPE(8) | 算术信号 |
SIGKILL(9) | 死亡信号 |
SIGSEGV(11) | 段错误信号 |
SIGALRM(14) | 闹钟信号 |
SIGCHLD(17) | 子进程结束信号 |
SIGCONT(18) | 进程继续信号 |
SIGSTOP(19) | 进程暂停信号 |
SIGTSTP(20) | 终端停止信号 |
4、编号小于SIGRGMI(34)的信号都是不可靠信号,不支持排队,因此接收时可能会丢失
5、编号位于[SIGRGMI(34),SIGRTMAX(64)]区间的都是可靠信号,此种信号支持排队,不会丢失
二、signal
1 typedef void (*sighandler_t)(int); 2 sighandler_t signal(int signum, sighandler_t handler); 3 功能:向内核注册一个信号处理的函数 4 signum:信号的编号,可以直接写数字,也可以用系统提供的宏 5 handler:函数指针 6 SIG_DFL 恢复信号默认的处理方式 7 SIG_IGN 忽略信号 8 返回值:是之前信号的处理方式 9 函数指针、SIG_DFL、SIG_IGN、SIN_ERR
三、信号的发送
1、由硬件产生的软件信号,如:键盘Ctrl+c,Ctrl+\,Ctrl+z,
2、错误产生的信号,如:非法访问内存,除0,硬件总线
3、命令产生的信号,如:kill,killall
4、函数产生的信号
1 int kill(pid_t pid,int sig); 2 功能:向指定的进程发送信号 3 pid:与watipid一样 4 sig:信号 5 0 表示空信号,不会向进程发送信号,但是会测试是否能向进程发送信号,这样可以检测一个进程是否存在,返回-1,表示进程不存在,errno为ESRCH 6 返回值:-1,说明进程不存在 7 8 int raise(int sig); 9 功能:向自己发送信号
四、睡眠函数
1 int pause(void); 2 功能:休眠 3 进程调用了pause函数后会进入睡眠状态,直到有信号把他叫醒(不被忽略的信号) 4 pause函数要么不返回(一直睡眠),要么返回-1 5 6 unsigned int sleep(unsigned int seconds); 7 功能:使用调用的进程睡眠seconds秒 8 调用sleep的进程如果没有睡眠足够的秒数,除非收到信号后才会返回 9 sleep的返回值是0,或剩余的秒数 10 11 int usleep(useconds_t usec); 12 功能:睡眠usec微秒 13 14 unsigned int alarm(unsigned int seconds); 15 功能:定时一个闹钟信号 16 让内核向调用它的进程,在seconds秒后发送一个 SIGALRM(14)信号 17 SIGALRM信号的默认处理方式是直接退出
五、信号集和信号屏蔽
1 a、信号集 2 int sigemptyset(sigset_t *set); 3 功能:清空信号集 4 5 int sigfillset(sigset_t *set); 6 功能:填满信号集 7 8 int sigaddset(sigset_t *set, int signum); 9 功能:向信号集中添加信号 10 11 int sigdelset(sigset_t *set, int signum); 12 功能:从信号集中删除信号 13 14 int sigismember(const sigset_t *set, int signum); 15 功能:测试一个信号集中是否存在某个信号 16 b、屏蔽信号集中的信息 17 int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 18 功能:设置进程的信号掩码(信号屏蔽码) 19 how:修改信号掩码的方式 20 SIG_BLOCK 向信号掩码中添加信号,并集(以信号集的方式添加) 21 SIG_UNBLOCK 从信号掩码中删除信号,补集的交集 22 SIG_SETMASK 用新的信号集替换旧的信号掩码 23 newset:新添加、删除、替换的信号集,也可以为空 24 oldset:获取旧的信号掩码 25 当newset为空时,就是在备份信号掩码 26 c、sigpending 27 int sigpending(sigset_t *set); 28 功能:获取未决状态的信号
六、信号处理函数
1 int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact); 2 功能:设置或获取信号处理 3 4 struct sigaction { 5 void (*sa_handler)(int);//信号处理函数指针 6 void (*sa_sigaction)(int, siginfo_t *, void *);//信号处理函数指针 7 int signum:信号码 8 siginfo_t* info:系统自带结构体 9 void* ptr:保留 10 sigset_t sa_mask;//信号屏蔽码 11 int sa_flags; 12 SA_NOCLDSTOP:SIGSTOP,SIGTSTP,SIGTTIN、SIGTTOU 子进程停止,忽略SIGCHLD信号 13 SA_NODEFER/SA_NOMASK:在处理信号时不屏蔽信号 14 SA_RESETHAND:处理完信号后,恢复系统默认处理方式 15 SA_RESTART:当信号处理函数中断了系统调用,则重启系统调用 16 SA_SIGINFO:用sa_sigaction处理信号 17 void (*sa_restorer)(void);//保留(NULL) 18 }; 19 20 int sigqueue(pid_t pid, int sig, const union sigval value);
标签:table 信号 ISE apt struct restart ati 产生 gac
原文地址:https://www.cnblogs.com/xkk956227639/p/9368336.html