#i nclude
int pause(void);
int sigsuspend(const sigset_t *sigmask);
pause函数很简单,就是挂起进程直到一个信号发生了.而sigsuspend也是挂起进程只是在
调用的时候用sigmask取代当前的信号阻塞集合.
#i nclude
int sigsetjmp(sigjmp_buf env,int val);
void siglongjmp(sigjmp_buf env,int val);
还记得goto函数或者是setjmp和longjmp函数吗.这两个信号跳转函数也可以实现程序的
跳转让我们可以从函数之中跳转到我们需要的地方.
由于上面几个函数,我们很少遇到,所以只是说明了一下,详细情况请查看联机帮助.
4。一个实例
还记得我们在守护进程创建的哪个程序吗?守护进程在这里我们把那个
程序加强一下. 下面这个程序会在也可以检查用户的邮件.不过提供了一个开关,如果用 户不想程序提示有新的邮件到来,可以向程序发送SIGUSR2信号,如果想程序提供提示可以
发送SIGUSR1信号.
#i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude
/* Linux 的默任个人的邮箱地址是 /var/spool/mail/ */ #define MAIL_DIR \ /* 睡眠10秒钟 */ #define SLEEP_TIME 10 #define MAX_FILENAME 255
unsigned char notifyflag=1;
long get_file_size(const char *filename) {
struct stat buf;
if(stat(filename,&;buf)==-1) {
if(errno==ENOENT)return 0; else return -1; }
return (long)buf.st_size; }
void send_mail_notify(void) {
fprintf(stderr,\ }
void turn_on_notify(int signo) {
notifyflag=1; }
void turn_off_notify(int signo) {
notifyflag=0; }
int check_mail(const char *filename) {
long old_mail_size,new_mail_size; sigset_t blockset,emptyset; sigemptyset(&;blockset); sigemptyset(&;emptyset);
sigaddset(&;blockset,SIGUSR1); sigaddset(&;blockset,SIGUSR2);
old_mail_size=get_file_size(filename); if(old_mail_size0) send_mail_notify(); sleep(SLEEP_TIME); while(1) {
if(sigprocmask(SIG_BLOCK,&;blockset,NULL)old_mail_size)send_mail_notify; old_mail_size=new_mail_size; sleep(SLEEP_TIME); }
}
int main(void) {
char mailfile[MAX_FILENAME]; struct sigaction newact; struct passwd *pw;
if((pw=getpwuid(getuid()))==NULL) {
fprintf(stderr,\ exit(1); }
strcpy(mailfile,MAIL_DIR);
strcat(mailfile,pw->pw_name); newact.sa_handler=turn_on_notify; newact.sa_flags=0;
sigemptyset(&;newact.sa_mask);
sigaddset(&;newact.sa_mask,SIGUSR1); sigaddset(&;newact.sa_mask,SIGUSR2); if(sigaction(SIGUSR1,&;newact,NULL)