Skip to content

Latest commit

 

History

History
64 lines (40 loc) · 2.25 KB

线程与信号.md

File metadata and controls

64 lines (40 loc) · 2.25 KB

「 线程与信号 」

💬 线程在信号操作时的特性

  • 每一个线程可以向别的线程发送信号,pthread_kill() 函数用来完成这一操作

  • 每一个线程可以设置自己的信号阻塞集合,pthread_sigmask() 函数用来完成这一操作(类似于进程的 sigprocmask() 函数)

  • 每个线程可以设置针对某信号处理的方式,但同一进程中对某信号的处理方式只能有一个有效,即最后一次设置的处理方式

  • 如果别的进程向当前进程中发送一个信号,由哪个线程处理是未知的

💬 线程信号管理函数

  • 发送信号

    • 函数名:pthread_kill

    • 函数声明:

      extern int pthread_kill(pthread_t threadld, int signo);
      • threadld:接收信号的线程

      • signo:信号。如果等于 0,则进行错误检测而不发送信号

      • 返回值:发送信号成返回 0,错误返回 -1

  • 设置信号阻塞集合

    • 函数名:pthread_sigmask

    • 函数调用:

      extern int pthread_sigmask(int __how, __const__sigset_t *__restrict__newmask, __sigset_t *__restrict__oldmask);
      • how:定义了如何更改调用线程的信号掩码,其合法值包括:

        // 将第 2 个参数所描述的集合添加到当前进程阻塞的信号集中
        #define SIG_BLOCK 0     /* for blocking signals */
        // 将第 2 个参数锁描述的集合从当前进程阻塞的信号集中删除
        #define SIG_UNBLOCK 1   /* for unblocking signals */
        // 无论之前的阻塞信号,设置当前进程阻塞的集合为第 2 个参数描述的对象 
        #define SIG_SETMASK 2   /* for setting the signal mask */
      • 如果 set 是空指针,则参数 how 的值没有意义,且不会更改线程的阻塞信号集,因此该调用可用于查询当前受阻塞的信号

- End -