查看linu下有哪些信号:
kill -l
哪里会用到信号,比如你想结束掉一个进程 :ps -aux 查看进程
kill 结束进程
kill传递一个信号,信号会导致进程终止
windows任务管理器也是一样的道理,发送一个信号,导致进程终止
man 7 signal linux中查看信号的机制
信号产生种类
终端特殊按键
Ctrl+c SIGINT
Ctrl+z SIGTSTP //T表示终端 TSTP:终端暂停
Ctrl+\ SIGQUIT
产生的信号发送给当前shell中的前台进程
LINUX任务(jobs)详解
在用管理员执行一个命令后,用Ctrl+Z把命令转移到了后台。导致无法退出root的。
fg 1继续运行任务
bg 1 后台运行
硬件异常
1.除以0 操作 产生 8) SIGFPE 信号 cpu不能除0
2.访问非法内存 段错误
kill函数 或者kill命令
通过kill函数可以向一个进程发送制定的信号
设计到权限保护:如果你是一个普通用户,则不可能向root用户发送信号,
只能向自己创建的进程发送信号
int kill(pid_t pid,int sig)
pid>0 sig发送个ID为PID的进程
pid ==0 sig发送给与发送进程同组的所有进程
pid<0 发送给组ID为 PID的进程,并且发送进程具有向其发送信号的权限
pid== -1 sig发送给发送进程有权限向他们发送信号的系统上的所有进程
sig为0时,用于检测,特定为pid进程是否存在,如不存在 返回-1
#include<signal.h>
#include<stdio.h>
//如何为一个进程设置信号屏蔽字sigprocmask
void printsigset(const sigset_t *set){
int i;
for(i=1;i<32;++i){
if(sigismember(set,i)==1)//i信号是否在未决信号集中是否置位
putchar('1'); //置位打印1 否则打印0
else
putchar('0');
}
puts("");
}
int main(){
sigset_t s,p;//printf("%d",sizeof(s));//32位下128 个字节
sigemptyset(&s);//信号集阻塞清空
sigaddset(&s,SIGINT);//信号集中添加某一个信号
sigprocmask(SIG_BLOCK,&s,NULL);//BLOCK传递信号集和原有的信号集做一个或操作NULL,原来的信号集不关心NULL
while(1){
sigpending(&p);//获取当前进程的未决信号集
printsigset(&p);//打印未决信号集的函数
sleep(1);
}
return 0;
}