<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] # 信號集 ## 自定義信號集函數 為了方便對多個信號進行處理,一個用戶進程常常需要對多個信號做出處理,在 Linux 系統中引入了信號集(信號的集合)。 這個信號集有點類似于我們的 QQ 群,一個個的信號相當于 QQ 群里的一個個好友。 信號集是一個能表示多個信號的數據類型,sigset\_t set,set即一個信號集。既然是一個集合,就需要對集合進行添加/刪除等操作。 ~~~ #include <signal.h> ? int sigemptyset(sigset_t *set); //將set集合置空 int sigfillset(sigset_t *set); //將所有信號加入set集合 int sigaddset(sigset_t *set, int signo); //將signo信號加入到set集合 int sigdelset(sigset_t *set, int signo); //從set集合中移除signo信號 int sigismember(const sigset_t *set, int signo); //判斷信號是否存在 ~~~ 除sigismember外,其余操作函數中的set均為傳出參數。sigset\_t類型的本質是位圖。但不應該直接使用位操作,而應該使用上述函數,保證跨系統操作有效。 ~~~ int main() { sigset_t set; // 定義一個信號集變量 int ret = 0; ? sigemptyset(&set); // 清空信號集的內容 ? // 判斷 SIGINT 是否在信號集 set 里 // 在返回 1, 不在返回 0 ret = sigismember(&set, SIGINT); if (ret == 0) { printf("SIGINT is not a member of set \nret = %d\n", ret); } ? sigaddset(&set, SIGINT); // 把 SIGINT 添加到信號集 set sigaddset(&set, SIGQUIT);// 把 SIGQUIT 添加到信號集 set ? // 判斷 SIGINT 是否在信號集 set 里 // 在返回 1, 不在返回 0 ret = sigismember(&set, SIGINT); if (ret == 1) { printf("SIGINT is a member of set \nret = %d\n", ret); } ? sigdelset(&set, SIGQUIT); // 把 SIGQUIT 從信號集 set 移除 ? // 判斷 SIGQUIT 是否在信號集 set 里 // 在返回 1, 不在返回 0 ret = sigismember(&set, SIGQUIT); if (ret == 0) { printf("SIGQUIT is not a member of set \nret = %d\n", ret); } ? return 0; } ~~~ ## sigprocmask函數 信號阻塞集也稱信號屏蔽集、信號掩碼。每個進程都有一個阻塞集,創建子進程時子進程將繼承父進程的阻塞集。信號阻塞集用來描述哪些信號遞送到該進程的時候被阻塞(在信號發生時記住它,直到進程準備好時再將信號通知進程)。 所謂阻塞并不是禁止傳送信號, 而是暫緩信號的傳送。若將被阻塞的信號從信號阻塞集中刪除,且對應的信號在被阻塞時發生了,進程將會收到相應的信號。 我們可以通過 sigprocmask() 修改當前的信號掩碼來改變信號的阻塞情況 ~~~ #include <signal.h> ? int sigprocmask(int how, const sigset_t *set, sigset_t *oldset); 功能: 檢查或修改信號阻塞集,根據 how 指定的方法對進程的阻塞集合進行修改,新的信號阻塞集由 set 指定,而原先的信號阻塞集合由 oldset 保存。 ? 參數: how : 信號阻塞集合的修改方法,有 3 種情況: SIG_BLOCK:向信號阻塞集合中添加 set 信號集,新的信號掩碼是set和舊信號掩碼的并集。?相當于 mask = mask|set。 SIG_UNBLOCK:從信號阻塞集合中刪除 set 信號集,從當前信號掩碼中去除 set 中的信號。相當于 mask = mask & ~ set。 SIG_SETMASK:將信號阻塞集合設為 set 信號集,相當于原來信號阻塞集的內容清空,然后按照 set 中的信號重新設置信號阻塞集。相當于mask = set。 set : 要操作的信號集地址。 若 set 為 NULL,則不改變信號阻塞集合,函數只把當前信號阻塞集合保存到 oldset 中。 oldset : 保存原先信號阻塞集地址 ? 返回值: 成功:0, 失敗:-1,失敗時錯誤代碼只可能是 EINVAL,表示參數 how 不合法。 ~~~ ## sigpending函數 ~~~ ?#include <signal.h> ? int sigpending(sigset_t *set); 功能:讀取當前進程的未決信號集 參數: set:未決信號集 返回值: 成功:0 失敗:-1 ~~~ ~~~ int main() { // 自定義信號集 sigset_t myset, old; sigemptyset(&myset);// 清空 -》 0 ? // 添加要阻塞的信號 sigaddset(&myset, SIGINT); sigaddset(&myset, SIGQUIT); sigaddset(&myset, SIGKILL); ? // 自定義信號集設置到內核中的阻塞信號集 sigprocmask(SIG_BLOCK, &myset, &old); ? sigset_t pend; int i = 0; while (1) { // 讀內核中的未決信號集的狀態 sigpending(&pend); for (int i = 1; i<32; ++i) { if (sigismember(&pend, i)) { printf("1"); } else if (sigismember(&pend, i) == 0) { printf("0"); } } printf("\n"); sleep(1); i++; ? // 10s之后解除阻塞 if (i > 10) { // sigprocmask(SIG_UNBLOCK, &myset, NULL); sigprocmask(SIG_SETMASK, &old, NULL); } } ? return 0; } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看