APUE,TLPI读书笔记——信号

来源:互联网 发布:北京行知实验小学垃圾 编辑:程序博客网 时间:2024/04/29 14:51

信号类型及默认处理:

详见signal

改变信号处理:signal()

signal函数

sigaction(),可以附带一些信号信息

sigaction

信号处理过程:


发送信号函数:

kill(pid,sig);pid的不同取值有不同的发送对象。详见kill

发送信号还需要权限:

1.特权级可以对任何进程发送

2.root用户和组运行的init仅接受安装了处理器函数的信号

3.发送进程的real user ID或 effective user ID会匹配接受进程的real user ID 或者saved set-user-ID

4.无论ID检测结果,非特权进程可以向同一会话中任何其他进程发送信号

kill()中sig为0,无信号发送,可以检查改pid的进程是否存在

其他发送信号:raise(sig);对自身发送信号killpg();对某一进程组所有成员发送信号

显示信号描述:strsignal(sig);

信号集:详见man-online

sigemptyset(set); sigfillset(set);初始化信号集

sigaddset(set,sig);sigdelset(set,sig);添加/删除信号

sigismember(set, sig);检测该信号是否是set成员

GNU C的非标准函数:sigandset,sigorset,sigismeptyset

信号掩码:

sigprocmask()根据参数将信号集中的信号从信号掩码中添加/删除/赋值

sigprocmask

sigpending(set)检查等待状态中的signal;结果在set上返回


设计信号处理函数:1.设置全局变量(错误码)并退出;2.执行清理动作终止进程后,信号本地跳转(sigsetjmp,siglongjmp)


可重入函数:在多线程处理中,可以同时安全地调用一个函数则被成为可重入。SUSv3定义:即使交叉执行,以未定义顺序调用结果也一样。

ps:更新全局变量或静态数据的是不可重入的。可重入函数不一定线程安全(e.g:操作同一块数据),线程安全不一定可重入(e.g:使用了mutex,中断可能死锁在获得mutex上)。

关于可重入函数更多以及与线程之间的关系,查看quora

异步信号安全函数:要么函数可重入,要么信号处理函数无法被中断。

信号异步处理函数概览


abort()异常终止进程,并生成core dump文件。

调用信号处理函数时,内核会在进程栈中创建一帧。因此,达到栈上限是,无法处理SIGSEGV信号。

确保SIGSEGV信号处理,先分配一块备选信号栈的内存区。调用sigalstack()告诉信号栈。创建信号处理函数时指定SA_ONSTACK即可在备选栈上处理

signalstack

SA_RESTART信号标志重启部分被信号中断的系统调用。详见signal


core dump信号:特定信号引发钱创建,是内存映像中的一个文件,供调试。

更多概念:core 信号默认处理函数默认结果产生core的:signal


TASK_INTERRUPTIBLE:进程可被中断,传递信号会唤醒进程

TASK_UNINTERRUPTIBLE:进程不可被中断(不会传递信号),不会立即被kill

TASK_KILLABLE :类似于TASK_UNINTERRUPTIBLE,但能够接受kill信号


硬件产生的信号:SIGBUS,SIGFPE,SGILL,SIGSEGV


信号同步生成(硬件信号和向自身传递)和异步生成。


同步信号立即传递,如raise()会在返回前发出。

异步会有延迟,传递的时机是该进程执行时内核态到用户态的切换(下一个时间片完成或系统调用完成),期间信号处于等待状态

解除阻塞后,信号按照信号百纳后的升序传递,无论产生次序。


实时信号(定义于POSIX.1b):全部可以用于程序自定义,linux中编号为32-64(共33个)

与标准信号的区别:详见signal

sigsuspend();//原子地解除信号阻塞和挂起进程,直到捕获信号返回,返回后掩码恢复到调用前

sigwaitinfo();//同步方式等待信号

signalfd();//通过文件描述符获取信号




0 0
原创粉丝点击