`
brxonline
  • 浏览: 61562 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

UNIX编程(10)-信号

    博客分类:
  • C
 
阅读更多

1.signal函数

 

 

#include <signal.h>

void (*signal(int signo, void (*func)(int)))(int);

 

Returns: previous disposition of signal (see following) if OK, SIG_ERR on error


一般可将signal函数的原型写成

Sigfunc *signal(int, Sigfunc *);

例:捕捉 SIGUSR1和SIGUSR2的简单程序

#include "apue.h"

static void sig_usr(int);   /* one handler for both signals */

int
main(void)
{
    if (signal(SIGUSR1, sig_usr) == SIG_ERR)
        err_sys("can't catch SIGUSR1");
    if (signal(SIGUSR2, sig_usr) == SIG_ERR)
        err_sys("can't catch SIGUSR2");
    for ( ; ; )
        pause();
}

static void
sig_usr(int signo)      /* argument is signal number */
{
    if (signo == SIGUSR1)
        printf("received SIGUSR1\n");
    else if (signo == SIGUSR2)
        printf("received SIGUSR2\n");
    else
        err_dump("received signal %d\n", signo);
}


2.中断的系统调用

3.可重入函数

4.SIGCLD语义

5.kill和raise函数

 

#include <signal.h>

int kill(pid_t pid, int signo);

int raise(int signo);

 

Both return: 0 if OK, 1 on error


调用raise(signo)等价于调用kill(getpid(), signo)

kill的pid参数有四种不同的情况

 

6.alarm和pause函数

 

 

#include <unistd.h>

unsigned int alarm(unsigned int seconds);

 

Returns: 0 or number of seconds until previously set alarm

参数seconds的值是秒数,经过了指定的seconds秒后会产生信号SIGALRM

 

 

 

#include <unistd.h>

int pause(void);

 

Returns: 1 with errno set to EINTR


pause函数使调用进程挂起直至捕捉到一个信号

 

7.信号集

 

 

#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);

 

All four return: 0 if OK, 1 on error

 

int sigismember(const sigset_t *set, int signo);

 

Returns: 1 if true, 0 if false, 1 on error


8.sigprocmask函数

 

 

#include <signal.h>

int sigprocmask(int how, const sigset_t *restrict set,
                sigset_t *restrict oset);

 

Returns: 0 if OK, 1 on error


当oset非空,那么进程的当前信号屏蔽字通过oset返回

当set非空,参数how指示如何修改当前信号屏蔽字

 

how

Description

SIG_BLOCK

The new signal mask for the process is the union of its current signal mask and the signal set pointed to by set. That is, set contains the additional signals that we want to block.

SIG_UNBLOCK

The new signal mask for the process is the intersection of its current signal mask and the complement of the signal set pointed to by set. That is, set contains the signals that we want to unblock.

SIG_SETMASK

The new signal mask for the process is replaced by the value of the signal set pointed to by set.

例:为进程打印信号屏蔽字

#include "apue.h"
#include <errno.h>

void
pr_mask(const char *str)
{
    sigset_t    sigset;
    int         errno_save;

    errno_save = errno;     /* we can be called by signal handlers */
    if (sigprocmask(0, NULL, &sigset) < 0)
        err_sys("sigprocmask error");

    printf("%s", str);
    if (sigismember(&sigset, SIGINT))   printf("SIGINT ");
    if (sigismember(&sigset, SIGQUIT))  printf("SIGQUIT ");
    if (sigismember(&sigset, SIGUSR1))  printf("SIGUSR1 ");
    if (sigismember(&sigset, SIGALRM))  printf("SIGALRM ");

    /* remaining signals can go here */

    printf("\n");
    errno = errno_save;
}


9.sigpending函数

 

 

#include <signal.h>

int sigpending(sigset_t *set);

 

Returns: 0 if OK, 1 on error


例:信号设置和sigprocmask实例

#include "apue.h"

static void sig_quit(int);

int
main(void)
{
    sigset_t    newmask, oldmask, pendmask;

    if (signal(SIGQUIT, sig_quit) == SIG_ERR)
        err_sys("can't catch SIGQUIT");

    /*
     * Block SIGQUIT and save current signal mask.
     */
    sigemptyset(&newmask);
    sigaddset(&newmask, SIGQUIT);
    if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
        err_sys("SIG_BLOCK error");

    sleep(5);   /* SIGQUIT here will remain pending */
    if (sigpending(&pendmask) < 0)
        err_sys("sigpending error");
    if (sigismember(&pendmask, SIGQUIT))
        printf("\nSIGQUIT pending\n");

    /*
     * Reset signal mask which unblocks SIGQUIT.
     */
    if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
        err_sys("SIG_SETMASK error");
    printf("SIGQUIT unblocked\n");

    sleep(5);   /* SIGQUIT here will terminate with core file */
    exit(0);
}

static void
sig_quit(int signo)
{
    printf("caught SIGQUIT\n");
    if (signal(SIGQUIT, SIG_DFL) == SIG_ERR)
        err_sys("can't reset SIGQUIT");
}


10.sigaction函数

 

#include <signal.h>

int sigaction(int signo, const struct sigaction
 *restrict act,
              struct sigaction *restrict oact);

 

Returns: 0 if OK, 1 on error

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 */

       /* alternate handler */
       void     (*sa_sigaction)(int, siginfo_t *, void *);
    };
11.sigsetjmp和siglongjmp函数

 

 

#include <setjmp.h>

int sigsetjmp(sigjmp_buf env, int savemask);

 

Returns: 0 if called directly, nonzero if returning from a call to siglongjmp

void siglongjmp(sigjmp_buf env, int val);

 

12.sigsuspend函数

 

 

#include <signal.h>

int sigsuspend(const sigset_t *sigmask);

 

Returns: 1 with errno set to EINTR

 

 13.abort函数

 

 

#include <stdlib.h>

void abort(void);

 

This function never returns


14.system函数

15.sleep函数

 

 

#include <unistd.h>

unsigned int sleep(unsigned int seconds);

 

Returns: 0 or number of unslept seconds

 

16.其他函数

 

#include <signal.h>

void psignal(int signo, const char *msg);

 


 

#include <string.h>

char *strsignal(int signo);

 

Returns: a pointer to a string describing the signal


 

#include <signal.h>

int sig2str(int signo, char *str);

int str2sig(const char *str, int *signop);

 

Both return: 0 if OK, 1 on error

 

分享到:
评论

相关推荐

    UNIX系统编程手册-上.((德)Michael Kerrisk ).part1.rar

    UNIX系统编程手册-上.((德)Michael Kerrisk )一本linux开发比较全和权威的书籍分上下册

    UNIX环境高级编程-010_信号

    UNIX环境高级编程一套电子书! 一共23部分19章。最后4部分为:函数原型、其它源码、习题答案、参考资料 如果您对某章节感兴趣,则下载非常方便! 如果此资源有侵权,请通知我,我会及时撤销下载!

    UNIX网络编程-第2卷-进程间通信

    本书全面深入地讲述了各种进程间通信(IPC)形式,它们是几乎所有复杂精致的UNIX程序的性能之关键。从网络编程角度看,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。本书从对Posix IPC和System V IPC...

    UNIX系统编程手册-下.((德)Michael Kerrisk ).part3.rar

    UNIX系统编程手册-上.((德)Michael Kerrisk )一本linux开发比较全和权威的书籍分上下册

    UNIX系统编程手册-下.((德)Michael Kerrisk ).part1.rar

    UNIX系统编程手册-上.((德)Michael Kerrisk )一本linux开发比较全和权威的书籍分上下册

    UNIX系统编程手册-上.((德)Michael Kerrisk ).part2.rar

    UNIX系统编程手册-上.((德)Michael Kerrisk )一本linux开发比较全和权威的书籍分上下册

    UNIX系统编程手册-下.((德)Michael Kerrisk ).part2.rar

    UNIX系统编程手册-上.((德)Michael Kerrisk )一本linux开发比较全和权威的书籍分上下册

    UNIX系统编程手册-上.((德)Michael Kerrisk ).part3.rar

    UNIX系统编程手册-上.((德)Michael Kerrisk )一本linux开发比较全和权威的书籍分上下册

    UNIX网络编程-第2卷 程间通信 源代码

    进程间通信(IPC)几乎是所有Unix程序性能的关键,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。本书从对Posix IPC和System V IPC的内部结构开始讨论,全面深入地介绍了4种IPC形式:消息传递(管道、...

    LINUX.UNIX系统编程手册(下册)

    《linux/unix系统编程手册(上、下册)》是介绍linux与unix编程接口的权威著作。linux编程资深专家michael kerrisk在书中详细描述了linux/unix系统编程所涉及的系统调用和库函数,并辅之以全面而清晰的代码示例。...

    UNIX系统编程.pdf

    本书是UNIX系统编程的经典教材,并基于最新的UNIX标准进行了更新,其内容完全覆盖文件、信号、POSIX线程、UDP、Web和客户机-服务器等相关内容,并对通信、并发和多线程问题进行了透彻的研究,对复杂的概念进行了...

    Linux UNIX系统编程手册

    《Linux/UNIX系统编程手册(上、下册)》是介绍Linux与UNIX编程接口的权威著作。Linux编程资深专家Michael Kerrisk在书中详细描述了Linux/UNIX系统编程所涉及的系统调用和库函数,并辅之以全面而清晰的代码示例。 ...

    unix高级环境编程-第三版-图书-源代码

    本书是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的更新版。在本书第1版出版后的十几年中,UNIX行业已经有了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持了...

    UNIX环境高级编程

    目 录 译者序 译者简介 前言 第1章 UNIX基础知识 1 ... 本书内容丰富权威,概念清晰精辟,一直以来被誉为UNIX编程的“圣经”,对于所有UNIX程序员—无论是初学者还是专家级人士—都是一本无价的参考书籍。

    UNIX网络编程_卷2_进程间通信

    《UNIX网络编程.卷2:进程间通信(第2版)》是一部UNIX网络编程的经典之作!进程间通信(IPC)几乎是所有Unix程序性能的关键,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。《UNIX网络编程.卷2:进程间...

    UNIX环境高级编程-中文第三版

    本书是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的更新版。书中除了介绍UNIX文件和目录、标准I/O库、系统数据文件和信息、进程环境、进程控制、进程关系、信号、线程、线程控制、...

    Unix环境高级编程pdf

    本书是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的更新版。在本书第1版出版后的十几年中,UNIX行业已经有了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持了...

    unix环境高级编程源码

    本书是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的更新版。在本书第1版出版后的十几年中,UNIX行业已经有了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持了...

Global site tag (gtag.js) - Google Analytics