zoukankan      html  css  js  c++  java
  • 【APUE】关于信号的一些常用函数

    kill和raise函数

    #include <signal.h>

    int kill(pid_t pid,int signo);

    int raise(int signo);//两个函数返回值:若成功则返回0,若出错则返回-1

    kill函数将信号发送给进程或进程组,raise函数则允许进程向自身发送信号。

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

    kill的pid参数有4种不同的情况:

      pid>0 将该信号发送给进程id为pid的进程

      pid==0 将该信号发送给与发送进程属于同一进程组的所有进程,不包括系统进程集

      pid<0 将该信号发送给进程组id等于pid的绝对值的进程,不包括系统进程

      pid==-1 将该信号发送给发送进程有权限向它们发送信号的系统上的所有进程,不包括系统进程

    进程将信号发送给其他进程需要权限,超级用户可将信号发送给任一进程,对于非超级进程,其基本规则是发送者的实际或有效用户id必须等于接收者的实际或有效用户id

    POSIX.1将编号为0的信号定义为空信号

    alarm和pause函数

    #include <unistd.h>

    unsigned int alarm(unsigned int seconds);

    返回值:0或者以前设置的闹钟时间的余留秒数

     alarm函数设置一个计时器,在将来某个指定的时间该计时器会超时,当计时器超时时,产生SIGALRM信号

     #include <unistd.h>

    int pause(void);

    返回值:-1,并将errno设置为EINTR

    pause函数将调用进程挂起直至捕捉到一个信号,只有执行了一个信号处理程序并从其返回时,pause才返回。

    信号集

    信号种类数目可能超过一个整型量所包含的位数,所以一般而言,不能用整型量中的一位代表一种信号,也就是不能用一个整型量表示信号集。POSIX.1定义了数据类型sigset_t来表示信号集。

     #include <signal.h>

    int sigemptyset(sigset_t *set);//清除set中所有信号

    int sigfillset(sigset_t *set);//使set包括所有信号

    int sigaddset(sigset_t *set,int signo);

    int sigdelset(sigset_t *set,int signo);

    //以上四个函数成功返回0,出错返回-1

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

     所有应用程序在使用信号集前,要对该信号集调用sigemptyset或sigfillset一次,因为c编译器将把未赋初值的外部和静态变量都初始化为0,而这是否与给定系统上信号集的实现相对应却并不清楚。

    对所有以信号集作为参数的函数,我们总是以信号集地址作为向其传送的参数。

    如果实现的信号数少于一个整型量所包含的位数,则可用一位代表一个信号的方法实现信号集。

    sigprocmask函数

    信号屏蔽字指进程中被屏蔽的信号集,这些信号因为阻塞而不能传给该进程

    sigprocmask函数可以检测或更改信号屏蔽字。

    #include <signal.h>

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

    若oset是非空指针,则进程的当前信号屏蔽字通过oset返回,若set是非空指针,则how指示如何修改当前信号屏蔽字,如果set是空指针,则不改变该进程的信号屏蔽字,how的值也无意义

    sigpending函数

    #include <signal.h>

    int sigpending(sigset_t *set);

    该函数返回信号集,其中的各个信号对于调用进程是阻塞的而不能传递。

    sigaction函数

    #include <signal.h>

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

    该函数的功能是检查或修改与指定信号相关联的处理动作。

    参数signo是要检测或修改其具体动作的信号编号。若act指针非空,则要修改其动作。如果oact指针非空,则系统经由oact指针返回该信号的上一个动作。

    sigsetjmp和siglongjmp函数

    #include <setjmp.h>

    int sigsetjmp(sigjmp_buf env,int savemask);

    void siglongjmp(sigjmp_buf env,int val);

    如果savemask非0,则sigsetjmp在env中保存进程的当前信号屏蔽字,调用siglongjmp时,如果带非0 savemask的sigsetjmp调用已经保存了env,则siglongjmp从其中恢复保存的信号屏蔽字。

    sigsuspend函数

    更改进程的信号屏蔽字可以阻塞所选择的信号,或解除对它们的阻塞,使用这种技术可以保护不希望由信号中断的代码临界区。如果希望对一个信号解除阻塞,然后pause以等待以前被阻塞的信号发生,如果在解除阻塞时刻和pause之间确实发生了信号,那么该信号可能就丢失了,使得pause永远阻塞。

    为此,需要在一个原子操作中先恢复信号屏蔽字,然后使进程休眠。这种功能由sigsuspend函数提供。

    #include <signal.h>

    int sigsuspend(const sigset_t *sigmask);

    将进程的信号屏蔽字设置为由sigmask指向的值。在捕捉到一个信号或发生了一个会终止该进程的信号之前,该进程被挂起。如果捕捉到一个信号而且从该信号处理程序返回,则sigsuspend返回,并且将该进程的信号屏蔽字设置为调用sigsuspend之前的值。

    abort函数

    #include <stdlib.h>

    void abort(void);

    abort函数的功能是使异常程序终止。此函数将SIGABRT信号发送给调用进程,ISO C规定,调用abort将向主机环境递送一个未成功终止的通知,其方法是调用raise(SIGABRT)函数。

    让进程捕捉SIGABRT的意图是:在进程终止之前由其执行所需的清理操作,如果进程并不在信号处理程序中终止自己,POSIX.1声明当信号处理程序返回时,abort终止该进程。

     sleep函数

    #include <unistd.h>

    unsigned int sleep(unsigned int seconds);

    //返回值:0或者未休眠够的秒数

    此函数使调用进程被挂起,直到满足以下条件之一:

    1)已经过了seconds所指定的时间

    2)调用进程捕捉到了一个信号并从信号处理程序返回

    参考:

    http://blog.chinaunix.net/uid-25120309-id-3301181.html

  • 相关阅读:
    在aarch版编译libEasyRTSPClient库无法通过问题解决
    视频流媒体推流平台RTMP协议是如何进行网络连接并推送视频流的?
    建立视频直播服务用RTMP协议还是RTSP协议?
    如何搭建RTMP视频流媒体推流服务器
    Winsock Select模型范例
    欢迎大家加入broncho社区与broncho共同发展
    在Windows环境使用Broncho映像[转]
    DirectFB几个辅助工具
    Linux手机研发要过五大难关
    让语言选择即时生效
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/3838534.html
Copyright © 2011-2022 走看看