芜湖门户网站建设多少钱,甘肃三北防护林建设局网站,浏览器主页制作,做广告的公司#xff08;1#xff09;信号的概念 信号的特点#xff1a;简单#xff0c;不能携带大量信息#xff0c;满足某种特定条件才触发。 信号的机制#xff1b;“软中断”#xff0c;通过软件方式实现#xff0c;具有很强的延时性。每个进程收到的信号#xff0c;都由内核负…1信号的概念 信号的特点简单不能携带大量信息满足某种特定条件才触发。 信号的机制“软中断”通过软件方式实现具有很强的延时性。每个进程收到的信号都由内核负责发送内核处理。 信号的产生1按键产生ctrlc,ctrlz,ctrl\ 2) 系统调用产生killabortraise 3软件条件产生定时器alarm 4)硬件异常产生非法访问内存段错误除0浮点数例外内存对齐出错总线错误 5命令产生kill 信号的处理方式1执行默认动作 1Term 终止进程 2lgn忽略信号3core终止进程查验死亡原因gdb调试 4Stop停止暂停进程5Cont:继续进程 2忽略舍弃 3捕捉掉用户处理函数 信号的四要素编号 名称 事件 默认处理动作 Linux内核中有一个PCB进程控制块是一个结构体task_struct,里面保存了进程id,状态工作目录用户id,用户组id,文件描述符和阻塞信号集及未决信号集。 信号的编号由kill -i查看当前系统可使用的命令其中1~31为常规信号34~64为实时信号。 在31个常规信号中9SIGKILL和19SIGSTOP信号不能被忽略和捕捉智能执行默认动作不能设置其为阻塞。
2信号的产生 1终端按键产生信号ctrlc --2)SIGINT(终止、中断ctrlz ---20)SIGTSTP暂时、停止 ctrl\---3)SIGQUIT(退出 2 硬件产生信号除零操作--8)SIGFPE(浮点数例外 非法访问内存--11)SIGSEGV段错误 总线错误 ---7)SIGBUS 3 kill函数或命令产生信号 kill -SIGKILL pid int kill(pid_t pid,int sig); 成功0 失败-1 sig:不推荐直接使用数字应使用宏名。因为不同的操作系统可能编号不一样但名称一致。 pid0 发送信号给指定进程 pid0 发送信号给调用kill函数同一进程组的所有进程。 pid0 取|pid|发给对应进程组 pid-1 发送给当前用户组的所有进程 raise函数给自己发指定信号 int raiseint sigkill(getpid(),sig) abort函数给自己发送异常终止信号 6SIGABRT信号终止并产生core文件void abort(void) 4)软件产生信号 alarm函数定时固定秒数之后内核给当前进程发送14)SIGALRM信号终止进程每个进程只有一个闹钟 unsigned int alarm(unsigned int seconds); 返回0或剩余的秒数上一次定时剩余的秒数 alarm0取消定时 采用自然定时发与进程状态无关 setitimer函数定时可以达到微秒可实现循环定时。 int setitimer(int which,const struct itimerval*new_value,struct itimerval*old_value); 参数which定时方式ITIMER_REAL(自然定时法-)--14)SIGLARM ITIMER_VIRTUAL(虚拟空间计时用户时间----26SIGVTALRM ITMER_PROF(运行时间计时用户内核------27SIGPROF 程序实际执行的时间系统时间用户时间等待时间 其中it_interval为周期定时的时间it_value为当前定时的时间。
3信号集操作函数 内核通过读取未决信号集来判断信号是否被处理信号屏蔽字阻塞信号集mask可以影响未决信号集。 1 信号集设定 2sigprocmask函数屏蔽信号接触屏蔽设置信号集 int sigprocmask(int how,const sigset_t*set,sigset_t*oldset); how:SIG_BLOCK,set表示需要屏蔽的信号 SIG_UNBLOCK,set表示需要解屏蔽的信号 SIG_SETMASK:set表示需要替代原始的新屏蔽集。 3sigpending函数获取当前的未决信号集 int sigpending(sigset_t*set); //使用sigsimember来判断某个信号是否在其中
4信号捕捉 1signal函数注册一个信号捕捉函数抓信号由内核进行 typedef void(*sighandler_t)(int); sighandler_t signal(int signum,sighandler_t handler); 参数signum捕捉的信号 handle处理的函数 2sigaction函数修改信号处理动作 int sigaction(int signum,const struct sigaction*act,struct sigaction*oldact) 重点掌握1sa_handler:指定的信号捕捉后的处理函数名可以赋值为SIG_IGN(表示忽略SIG_DFL表示执行默认 2sa_mask调用信号处理函数时使用的屏蔽信号集临时设置执行完函数即失效如果有信号为非屏蔽 信号集中的信号会先处理该信号 3sa_flags:设置为0,表默认属性信号捕捉函数期间默认屏蔽本信号 阻塞的常规信号不支持排队产生多次只记录一次捕捉函数执行完之后再执行该阻塞信号。 其他第五个信号舍弃不用 当sa_flagsSA_SIGINFO时使用第二个参数处理程序。 3内核实现信号捕获过程