linux应用程序编程---信号

作者在 2010-10-11 15:20:46 发布以下内容
信号
#include <signal.h>

int sigemptyset(sigset_t *set);  
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signo);
int sigdelset(sigset_t *set, int signo);
int sigismember(const sigset_t *set, int signo);

函数sigemptyset初始化set所指向的信号集,使其中所有信号的对应bit清零,表示该信号集不包含任何有效信号。函数sigfillset初始化set所指向的信号集,使其中所有信号的对应bit置位,表示该信号集的有效信号包括系统支持的所有信号。注意,在使用sigset_t类型的变量之前,一定要调用sigemptyset或sigfillset做初始化,使信号集处于确定的状态。初始化sigset_t变量之后就可以在调用sigaddset和sigdelset在该信号集中添加或删除某种有效信号。这四个函数都是成功返回0,出错返回-1。sigismember是一个布尔函数,用于判断一个信号集的有效信号中是否包含某种信号,若包含则返回1,不包含则返回0,出错返回-1

总结:
信号的初始化分以下几步:
1.sigemptyset(sigset_t *set);
2. sigaddset(sigset_t *set, int signo);
3.初始化sigaction 结构体
struct sigaction
{
   void   (*sa_handler)(int);   /* addr of signal handler,or SIG_IGN, or SIG_DFL */
   sigset_t sa_mask;               /* additional signals to block */
   int      sa_flags;              /* signal options, Figure 10.16 */
   void     (*sa_sigaction)(int, siginfo_t *, void *);/* alternate handler */
};
struct sigaction act;
act.sa_handlder= somefunc_pointer;
act.sa_mask=(sigset_t) mask;
act.sa_flag= 0;
4.调用sigaciton() 函数


#include <unistd.h>
#include <signal.h>
#include <stdio.h>

void sig_alrm(int signo)
{
    /* nothing to do */
}

unsigned int mysleep(unsigned int nsecs)
{
    struct sigaction newact, oldact;
    unsigned int unslept;

    newact.sa_handler = sig_alrm;
    sigemptyset(&newact.sa_mask);
    newact.sa_flags = 0;
    sigaction(SIGALRM, &newact, &oldact);

    alarm(nsecs);
    pause();

    unslept = alarm(0);
    sigaction(SIGALRM, &oldact, NULL);

    return unslept;
}

int main(void)
{
    while(1){
        mysleep(2);
        printf("Two seconds passed\n");
    }
    return 0;
}
 
默认分类 | 阅读 725 次
文章评论,共0条
游客请输入验证码
浏览48254次
文章分类