功能描述:
sigsuspend 函数将进程的信号屏蔽字设置为 sigmask 指向的值。在捕捉到一个信号或发生了一个会终止该进程的信号之前,该进程被挂起。如果捕捉到一个信号而且从该信号处理程序返回,则sigsuspend返 回,在返回之前,将进程的信号屏蔽字设置为调用sigsuspend之前的值。
用 法:
# include < signal . h>
int sigsuspend ( const sigset_t * sigmask ) ;
参 数:
sigmask: 指向信号集的指针,里面设置了屏蔽的信号
返回说明:
函数没有成功返回值。如果它返回到调用者,则总是返回-1,并将 errno 设置为EINTR(表示一个被中断的系统调用)。
列子:
- #include <stdio.h>
- #include <stdlib.h>
- #include <signal.h>
- volatile sig_atomic_t quitflag; /* set nonzero by signal handler */
- /* one signal handler for SIGINT and SIGQUIT */
- static void sig_handler(int signo)
- {
- if (signo == SIGINT)
- printf("ninterruptn");
- else if (signo == SIGQUIT)
- quitflag = 1; /* set flag for main loop */
- }
- int main(int argc, char *argv[])
- {
- sigset_t newmask, oldmask, zeromask;
- if (signal(SIGINT, sig_handler) == SIG_ERR)
- perror("signal(SIGINT) error");
- if (signal(SIGQUIT, sig_handler) == SIG_ERR)
- perror("signal(SIGQUIT) error");
- sigemptyset(&newmask);
- sigemptyset(&zeromask);
- sigaddset(&newmask, SIGQUIT);
- /* Block SIGQUIT and save current signal mask */
- if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) != 0)
- perror("sigprocmask SIG_BLOCK error");
- while (quitflag == 0)
- sigsuspend(&zeromask);
- quitflag = 0;
- /* Reset signal mask which unblocks SIGQUIT */
- if (sigprocmask(SIG_SETMASK, &oldmask, NULL) != 0)
- perror("sigprocmask SIG_SETMASK error");
- exit(0);
- }
我们运行程序:
输入: ctrl+c : 输出 : interrept
输入: ctrl+c : 输出 : interrept
输入: ctrl+c : 输出 : interrept
输入: ctrl+c : 输出 : interrept
输入: ctrl+/ 程序终止