https://blog.csdn.net/w903414/article/details/109802539
信号
产生信号的情况:
信号的3种处理方式:
系统默认动作“终止+core”表示在进程当前工作目录的core文件中复制了该进程的内存映像。大多数UNIX系统调试程序都使用core文件检查进程终止时的状态。
信号的详细介绍:
处理信号
使用 sigaction 代替 signal
事件发生时为进程产生一个信号,内核通常在进程表中以某种形式设置一个标志。当对信号采取了这种动作,称为向进程传递了一个信号。信号产生和递送之间的时间间隔内称信号是未决的。
进程可以选用“阻塞信号递送”。如果为进程产生了一个阻塞信号,而且对该信号的动作是系统默认动作或捕捉该信号,则此信号保持未决状态,直到该进程对此信号解除阻塞,或将动作改为忽略。内核在递送一个原来被阻塞的信号给进程时(而不是在产生此信号时),才决定对它的处理方式。于是进程在信号递送给它之前仍可以改变对该信号的动作。进程调用sigpending函数来判定哪些信号是设置为阻塞并处于未决状态的。
发送信号 kill raise
raise(signo)
等于 kill(getpid(), signo)
信号集
表示多个信号的数据类型。因数量太多,不能用整形量的一位或一个整形量表示信号。使用sigset_t表示信号集。
初始化时使用sigemptyset或sigfillset将set设为空或所有信号集合。
sigprocmask
仅为单线程定义,多线程中信号屏蔽使用另一个函数
一个进程的信号屏蔽字规定了当前阻塞而不能传递给该进程的信号集。调用sigprocmask可以检测修改信号屏蔽字。
how的可选值:
SIG_BLOCK是或操作,SIG_UNBLOCK是异或,SIG_SETMASK是赋值
sigpending
返回一信号集,对于调用进程,其中各信号是阻塞不能递送的,因而也一定是当前未决的。该信号集通过set参数返回。
在sleep休眠期间产生了某信号,那么此时该信号是未决的,但是不再受阻塞。
sigaction
检查、修改与指定信号关联的处理动作。用于取代sinal函数
当sa_handler字段包含一个信号捕捉函数的地址(不是SIG_IGN或SIG_DFL),则sa_mask字段说明了一个信号集,调用信号捕捉函数前这各信号集要加到进程的信号屏蔽字中,当信号捕捉函数返回时再恢复屏蔽字。这样调用信号处理函数时可以阻塞某些信号。某种信号被阻塞时,如果它发生了多次,那么这种信号解除阻塞后,其信号处理函数通常只会被调用一次。
sa_flags 可选项:
再sigaction结构中使用了 SA_SIGINFO 标志时,使用 sa_sigaction 字段的替代处理程序。sa_sigaction 与 sa_handler 只能选用一个。
sigsetjmp siglongjmp
用于非局部返回的setjmp和longjmp函数,再信号处理函数中返回时会导致屏蔽正在被处理的信号。
当捕捉到一个信号后,进入信号捕捉函数,此时当前信号被自动加到进程的信号屏蔽字中,这阻止了后来产生的这种信号中断信号处理程序。如果使用longjmp跳出信号处理函数,信号屏蔽字不会被保存和恢复。
sigsuspend
在一个原子操作中先恢复屏蔽字,然后使进程休眠。
abort
使程序异常终止。将SIGABRT信号发送给调用进程(进程不应忽略此信号)。用于在进程终止前由其执行所需的清理操作。
作业控制信号
标签:函数,阻塞,屏蔽,信号,Linux,进程,sa From: https://www.cnblogs.com/zhh567/p/16619390.html