linux信号.docx_第1页
linux信号.docx_第2页
linux信号.docx_第3页
linux信号.docx_第4页
linux信号.docx_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

信号-信号就是用来做中断的 属于异步软件中断信号分类:可靠信号 不可靠分类信号的处理方式 1.默认 2,忽略 3自定义1, 不设置走默认处理2, 用signal()/sigaction() 可以设置子进程的信号处理如果创建了子进程 fork()创建的子进程完全沿袭父进程对信号的处理方式 vfork()+excel()创建的子进程,父进程默认子进程也默认,符忽略 子也忽略父进程定义的子进程默认原因, vfork()+excel创建的子进程的代码区没有父进程的处理函数实验代码 先看fork()的子进程的信号处理 在用/后的代码看vfork()的1 #include 2 #include 3 #include 4 #include 5 void fa(int signo) 6 printf(捕获了信号 %dn,signo); 7 8 int main() 9 if(signal(SIGINT,fa)=SIG_ERR)/先设置 信号SIGINT(对应键盘ctrl+c)为 fa处理 10 perror(signal),exit(-1); 11 signal(SIGQUIT,SIG_IGN);/设置信号SIGQUIT(对应键盘ctrl+)为SIG_IGN(ignore). 12 13 pid_t pid=fork(); /pid_t pid=vfork() 14 if(pid=0) 15 printf(childpid=%dn,getpid(); 16 while(1); /excel(“p”,”p”,NULL);/这里的excel的参数自己乱取的,读者自己弄个可执行文件测试吧exit(0); 17 printf(father overn); 18 kill -2 pid就会调用fa 注:有时上述实验会出错,ps aux查看是否是因为系统同时在运行好几个a.out, killall a.outkillall 进程名称 可以杀掉所有的相同的进程名称。发送信号的方法一 键盘发送信号(部分信号)1, ctrl +c 信号2 SIGINT2, ctrl+ 信号3 SIGQUIT二 出错(部分信号)1. 整数除0 信号8 SIGFPE2. 段错误- -信号11 SIGSEGV3. 总线错误 信号7 SIGBUS三 kill命令发送(全部信号)kill 信号 进程PID四 信号发送函数raise() 给本进程法任意信号kill() 给任意进程(进程组)发送任意信号alarm() 给本进程法特定信号(闹钟)sigqueue() 给任意基础性发信号, 可以附带额外的数据(少用)主讲 kill() 了解alarm()int kill(pid_t,int signo)参数 pid指定发给哪个/那些进程signo 就是发送哪个信号pid有4钟值正数 给进程ID=PID的特定进程发信号-1 给所有有权限的进程发信号0 本进程组-1 进程组pID=-pid./q.c5 void fa(int signo) 6 printf(jinch %d buhuo le %dn,getpid(),signo); 7 8 int main() 9 pid_t pid=fork(); 10 if(pid=0) 11 signal(SIGINT,fa); 12 while(1); 13 14 printf(fijinch %d gei zijinch fale xinhaon,getpid(); 15 kill(pid,SIGINT); 16 alarm(参数n) N秒之后产生产生一个闹钟信号 SIGALRM 不是alarm n=0 则不会产生闹钟信号 可以用来取消前面的闹钟。返回值 : 之前的闹钟剩余的秒数(之前没有闹钟返回0)1 #include 2 #include 3 #include 4 void fa(int signo) 5 printf(buhuole xinhao%dn,signo); 6 7 int main() 8 signal(SIGALRM,fa); 9 int res=alarm(5); 10 printf(res=%dn,res);/0 11 sleep(3); 12 res=alarm(5);/前面的alarm还没响应 就不会响应了,res返回前面alarm剩余秒数 13 printf(res=%dn,res);/2 14 while(1); 15 16关于 sleep() 5 void fa(int signo) 6 printf(bu huo le xinhao %dn,signo); 7 8 int main() 9 signal(SIGINT,fa);/sleep()会被未忽略的信号中断 10 printf(beginn); 11 int res=sleep(10); /睡足了剩余0秒未睡,返回0. 12 printf(res=%dn,res);/sleep()返回睡了还剩余的秒数。类似 alarm的返回值。 13 printf(overn); 14 按ctrl+c 会打断sleep(),叫醒进程。sleep(n) 可能休眠n秒;也可能被 非忽略的信号打断,并返回剩余秒数。usleep(n) 休眠n 微秒(man手册 也一些不准确) (不返回剩余秒数 返回0/-1);信号集 信号集就是 信号的集合 可以理解成 一个超大的整数(为了操作系统的扩展性) 用一个二进制位对应一个信号。 最后一位代表信号 1,如果最后一位是1,代表信号集中有信号1,如果是0,就没有信号1. 信号集的类型 sigset_t.关于 数据结构sigset_t, 需要提供基本的函数如下:1 增加元素: sigaddset() 增加一个信号(但增) sigfillset() 放入所有信号(全增)2 删除信号sigdelset() 删除一个信号;(单删)sigemptyset() 清空信号集(全删)4. 查找信号sigismember() 判断信号是否存在 1 #include 2 #include 3 int main() 4 printf(size=%dn,sizeof(sigset_t);/128字节,本不必这么大,62个信号,64位 8个字节就行的, 为了系统扩展 5 sigset_t set; 6 printf(set=%dn,set);初始值为0,不一定的, 7 sigfillset(&set); /全增,为21亿多,2的32次方(有符号) 8 printf(set=%dn,set); 9 sigemptyset(&set); 10 printf(set=%dn,set); 11 sigaddset(&set,2);printf(set=%dn,set);2 12 sigaddset(&set,3);printf(set=%dn,set);6 13 sigaddset(&set,7);printf(set=%dn,set);70 14 sigdelset(&set,3);printf(set=%dn,set);66 15 if(sigismember(&set,2)printf(xinhao 2 cunzain); 信号屏蔽在执行一些关键代码是 进程需要屏蔽一些信号,防止 信号中断 代码(如,转账时)信号屏蔽不是保证 信号不来, 是 暂时不做处理,不会中断关键代码, 等关键代码执行完毕后,解除信号屏蔽时 再中断代码执行信号的处理函数。函数 sigprocmask() 负责信号屏蔽和解除。sigprocmask(int how,sigset_t*new,sigset_t*old)参数:new: 代表新的需要屏蔽的信号 传入old: 用于传出旧的信号屏蔽字(不用传给0)how 是运算方式 SIG_BLOCK 新+旧 比如 ABC+DEABCDESIG_UNBLOCK 旧的-新的 新的是需要去掉的屏蔽信号比如 ABC-CDE=ABSIG_SETMASK 直接使用新的,不考虑旧的 ABC CDECDE注:how 就选择SIG_SETMASK即可。./sigprocmask.c1 #include 2 #include 3 #include 4 void fa(int signo) 5 printf(bu huo le xinhao %dn,signo); 6 7 int main() 8 signal(SIGINT,fa); /不可靠信号,屏蔽时会丢失。printf(“pid=%dn”,getpid(); 9 signal(50,fa);/可靠信号 屏蔽是不丢失 10 printf(zhi xing putong chengxu,bu pingbi xinhaon); 11 sleep(20); 12 printf(执行关键代码,开始屏蔽信号n); 13 sigset_t new,old; 14 sigemptyset(&new); 15 sigaddset(&new,2);sigaddset(&new,50); 16 sigprocmask(SIG_SETMASK,&new,&old);/屏蔽信号 2 50 17 sleep(15); sigset-t pend; sigpending(&pend);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论