posts - 403, comments - 310, trackbacks - 0, articles - 7
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          CSAPP - Explicitly Blocking Signals

          Posted on 2007-09-05 12:22 ZelluX 閱讀(365) 評論(0)  編輯  收藏 所屬分類: System
          看了半天總算對這節(jié)有了個大致的感覺,首先看幾個和sigprocmask相關的函數(shù):

          #include <signal.h>

          int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
          int sigemptyset(sigset_t *set);
          int sigfillset(sigset_t *set);
          int sigaddset(sigset_t *set, int signum);
          int sigdelset(sigset_t *set, int signum);              // Return: 0 if OK, -1 on error
          int sigismember(const sigset_t *set, int signum);      // Return: 1 if member, 0 if not, -1 on error

          sigprocmask用于改變當前blocked signals的集合,how參數(shù)指定了具體的行為:
          SIG_BLOCK 把set中的信號添加到blocked列表(blocked = blocked | set)
          SIG_UNBLOCK 把set中的信號從blocked列表中移出(blocked = blocked & ~set)
          SIG_SETMASK blocked = set

          另外,如果oldset的值不是NULL的話,之前的blocked列表會保存在oldset中。

          而sigaddset sigdelset sigfillset sigemptyset都是用于操作sigset_t列表的函數(shù)。

          sigprocmask適用于在父子進程間同步的情況,以一個典型的UNIX shell程序為例,父進程需要在一個job list中記錄它所有的子進程,當父進程創(chuàng)建一個子進程時,它把子進程加入到job list中;當父進程reap一個子進程時,就從job list中移出這個進程。
          如果不同步父子進程,有可能發(fā)生這種情況:
          1. 父進程執(zhí)行fork函數(shù),內(nèi)核調(diào)度新創(chuàng)建的子進程替換父進程運行
          2. 在父進程能夠再次運行前,子進程終止,成為一個zombie,內(nèi)核發(fā)送SIGCHLD信號給父進程
          3. 父進程可以運行前,內(nèi)核發(fā)現(xiàn)了未處理的(pending)SIGCHLD信號,讓它由父進程的handler處理
          4. handler reap了終止的進程,調(diào)用deletejob函數(shù),實際上沒有任何作用,因為父進程還沒有把該子進程加入列表
          5. handler完成后,內(nèi)核繼續(xù)運行父進程,后者調(diào)用fork完成后繼續(xù),錯誤地把不存在的子進程加入了job list
          主站蜘蛛池模板: 惠安县| 麻栗坡县| 扬中市| 日喀则市| 景洪市| 商城县| 宕昌县| 江西省| 南和县| 永吉县| 长岛县| 息烽县| 柳州市| 毕节市| 绥阳县| 凤凰县| 龙岩市| 栖霞市| 依安县| 成安县| 海口市| 芒康县| 永顺县| 普兰店市| 武威市| 花莲市| 马山县| 镇赉县| 宜良县| 扶余县| 丁青县| 太原市| 巴中市| 柯坪县| 新蔡县| 射洪县| 工布江达县| 金秀| 原阳县| 德兴市| 雅江县|