吴江住房城乡建设局网站,小城镇建设官方网站,做教务网站的需求分析,动漫网站设计源代码1、信号机制
在linux和unix系统下#xff0c;如果想要处置(挂起#xff0c;结束)进程#xff0c;可以使用信号#xff0c;经典消息机制#xff0c;所以进程包括系统进程都是利用信号处置进程的
kill -l——查看所有系统支持的信号
1-31号信号——Unix经典信号#xff…1、信号机制
在linux和unix系统下如果想要处置(挂起结束)进程可以使用信号经典消息机制所以进程包括系统进程都是利用信号处置进程的
kill -l——查看所有系统支持的信号
1-31号信号——Unix经典信号是软件研发工程师需要了解的信号
32-33号信号——被系统隐藏归NPTL线程库使用不开放
34-64号信号——自定义信号驱动研发了解
2、触发信号的5种方式
ps aux——查看进程信息
1、终端组合按键触发信号
ctlc——发2号信号SIGINT
ctl\——发3号信号SIGQUIT
ctlz——发20号信号SIGTSTP
唤醒——fg 进程号
2、命令触发信号
kill -signo pid——可以向任意进程发出任意信号
3、函数触发信号
#includesignal.h
kill(pid_t pid,int signo);——向任意进程发送任意信号
raise(int signo);——向调用进程发送任意信号
abort(void)——向调用进程发送SIG_ABRT信号
./mykill 9 1000
mykill代码
#includestdio.h
#includeunistd.h
#includestdlib.h
#includestring.h
#includesignal.hint main(int argc,char**argv)
{if(argc3){ printf(mykill failed:pram error\n);exit(0);} kill(atoi(argv[2]),atoi(argv[1]));return 0;
}4、硬件异常系统触发信号
当进程执行时如果违规访问硬件系统会发送对应的信号杀死进程避免访问
1、当进程中出现进程访问权限异常例如只读内存写操作产生段错误(内存核心已转储)系统发送SIGSEGV(11号)信号杀死目标进程
2、进程访问内存越界触发总线错误(内存核心已转储)系统发送SIGBUS(7号)信号杀死目标进程
3、进程使用cpu计数异常系统抛出浮点数例外(核心已转储)系统发送SIGFPE(8号)信号杀死目标进程
5、软条件触发信号
在使用某个功能或设备时当使用满足了软条件系统会发送信号杀死进程
eg:
1、alarm定时器
用户可以自定义定时的时长当定时的时间达到系统会发送SIGALRM(14号)信号但是信号会杀死进程
alarm定时器
#includestdio.h
#includeunistd.h
#includestdlib.h
#includestring.h
#includesignal.hint main()
{int count0;alarm(1);while(1){ printf(count %d\n,count);} return 0;
}2、管道
管道读端关闭写端向管道写数据触发软条件系统向写端发送SIGPIPE(13号)杀死进程
3、信号的行为或动作
系统中提供的信号一般都是用来杀死或挂起进程信号的行为一般是被提前预设好的但是可以修改用户可以自定义变更行为和动作
SIGNAL一般有三种行为
1、SIG_DFL(默认行为:杀死目标)
是信号首选的默认行为
默认处理动作一般分为5种:
TERM——杀死进程
CORE——杀死进程并转储核心
IGN——不干预进程
STOP——挂起进程
COUNT——唤醒进程
2、SIG_IGN(忽略行为:放弃)
处理动作:NULL
3、SIG_ACTION(捕捉行为:自定义)
处理动作:自定义动作
捕捉函数
void sig_do(int n)
{printf(gfytguhbjgv\n);
}
捕捉函数需要开发者自行定义与实现但是只有信号触发抵达进程系统自动调用
行为1中的忽略动作与行为2的忽略行为相比结果一致但是优先级不同行为的优先级比动作高
每个信号拥有自己的信号行为结构体struct sigaction自己定义修改结构体对进程原有的结构体进行替换因为所有默认信号行为结构体中的行为都是默认的
处理行为设定
act.sa_handlerSIG_DFL/SIG_IGN/捕捉函数地址
默认选项
act.sa_flags0;
临时屏蔽字可以使用sigemptyset初始化
act.sa_mask;
结构体
struct sigaction act,oact;
void (*sa_handler)(int)
{act.sa_handlerSIG_DFL/SIG_IGN/捕捉函数地址act.sa_flags0;act.sa_mask;
}
4、改变信号行为的方法
用自定义结构体替换原有的结构体
第一个参数是要修改的信号
第二个参数是新的结构体
第三个参数是原有的结构体
sigaction(SIGINT,act,oact);
替换修改信号行为结构体一般情况下要传出进程原有的结构体便于复位
虽然SIGINT代表的是2号信号但是不能只传入2因为不同电脑的信号名和编号不一定相同
eg改变信号行为
#includestdio.h
#includeunistd.h
#includestdlib.h
#includestring.h
#includesignal.hvoid sig_do(int n)
{int flags3;while(flags--){ printf( flag %d running...\n,flags);sleep(1);}
}int main()
{struct sigaction act,oact;act.sa_handlersig_do;act.sa_flags0;sigemptyset(act.sa_mask);sigaction(SIGINT,act,oact);while(1)sleep(1);
}改变后不能使用ctrlc杀死程序
5、信号的传递与处理流程
1、信号由系统发出传递到PCB
2、PCB中有一个位图为64位每一位对应一个信号称为未决信号集
还有一个位图为64位每一位对应一个信号称为屏蔽字
3、信号从系统发出后还未到达未决信号集前称为待传递信号
信号能否通过未决信号集取决于未决信号集中的位码1为不允许0为允许
如果信号不被允许通过未决信号集则该信号会被直接丢弃放弃处理
4、如果信号通过了未决信号集但还未抵达屏蔽字集称为未决态信号都是待处理信号
如果信号通过了未决信号集系统会将对应的未决信号集的位码置1如果有相同信号再次被传递过来会被直接丢弃因为系统拒绝相同的信号同时传递未决信号集的变化是系统进程设置的
5、如果信号通过了屏蔽字集称为递达态信号
当信号变为递达态后未决信号集的位码会被归0
系统初始是避免相同信号递达的因为会产生捕捉函数调用冲突因此如果某个信号递达系统会设置临时屏蔽将对应的屏蔽字位置设置为1当递达信号处理完毕后再解除屏蔽
当信号变为递达态信号则信号正在处理进程将被处置杀死或者挂起见上面3
6、信号阻塞
指的是信号通过了未决信号集但是未通过屏蔽字
屏蔽字是开发者可以自行设置的用于屏蔽阻塞某些特定信号
7、如果同时发多个信号则系统只能处理前两个发过来的信号其余的会被全部丢弃
因为屏蔽字会被临时置1递达态信号处理完毕后才会归0
8、Unix经典信号不支持排队但是可以多阻塞1个
9、自定义信号34-64号支持排队
因为经典信号1-31号的设计初衷是处置进程
自定义信号34-64号被设计出来为了软硬件设计如磁盘探针寻址寻道用在上一页或下一页等操作上