先扯两个定义;
信号:向进程发送的软件通知,通知进程有事件发生。已经生成没有传递的信号称挂起(pending)的信号。如果传递信号时进程执行了信号处理程序,则称进程捕捉到了信号。
信号掩码:信号掩码包含了一个当前被阻塞(blocked)的列表。当进程解除对这个信号的阻塞时,信号就会被传递出去。可以通过调用sigprocmask来改变进程的信号掩码。
/* Clear all signals from SET. */
extern int sigemptyset (sigset_t *__set) __THROW __nonnull ((1));
/* Set all signals in SET. */
extern int sigfillset (sigset_t *__set) __THROW __nonnull ((1));
/* Add SIGNO to SET. */
extern int sigaddset (sigset_t *__set, int __signo) __THROW __nonnull ((1));
/* Remove SIGNO from SET. */
extern int sigdelset (sigset_t *__set, int __signo) __THROW __nonnull ((1));
/* Return 1 if SIGNO is in SET, 0 if not. */
extern int sigismember (__const sigset_t *__set, int __signo)
__THROW __nonnull ((1));
|
成功则返回0,否则-1,并且设置errno;
/* A `sigset_t' has a bit for each signal. */
# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
typedef struct
{
unsigned long int __val[_SIGSET_NWORDS];
} __sigset_t;
|
int sigprocmask (int __how, __const sigset_t *__restrict __set,
sigset_t *__restrict __oset) __THROW;
|
__how:
/* Values for the HOW argument to `sigprocmask'. */
#define SIG_BLOCK 0 /* Block signals. */
#define SIG_UNBLOCK 1 /* Unblock signals. */
#define SIG_SETMASK 2 /* Set the set of blocked signals. */
|
等待信号:
pause(),sigsuspend(),sigwait();
pause()简单。
sigsuspend()麻烦了
sigwait():
/* Select any of pending signals from SET or wait for any to arrive.
This function is a cancellation point and therefore not marked with __THROW. */
int sigwait (__const sigset_t *__restrict __set, int *__restrict __sig)
|
前一个是要等待的信号的集合。后一个是等到的信号个数。sigwait函数一直阻塞到__set指定的任何一个信号挂起为止,然后从挂起的信号集中删除那个信号,并解除对它的阻塞。当sigwait返回时,从挂起的信号集中删除的信号个数在__sig中。
阅读(1522) | 评论(0) | 转发(0) |