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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 信號,第 4 部分:信號 > 原文:<https://github.com/angrave/SystemProgramming/wiki/Signals%2C-Part-4%3A-Sigaction> ## 我如何以及為何使用`sigaction`? 您應該使用`sigaction`而不是`signal`,因為它具有更好的定義語義。 `signal`在不同的操作系統上做了不同的事情,**壞** `sigaction`更便攜,如果需要更好地為線程定義。 要改變過程的“信號處理” - 即當信號傳遞到您的過程時會發生什么 - 使用`sigaction` 您可以使用系統調用`sigaction`來設置信號的當前處理程序,或者讀取特定信號的當前信號處理程序。 ```c int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); ``` sigaction 結構包括兩個回調函數(我們只會查看'handler'版本),一個信號掩碼和一個 flags 字段 - ```c struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; }; ``` ## 如何將`signal`調用轉換為等效的`sigaction`調用? 假設您為警報信號安裝了信號處理程序, ```c signal(SIGALRM, myhandler); ``` 等效的`sigaction`代碼是: ```c struct sigaction sa; sa.sa_handler = myhandler; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sigaction(SIGALRM, &sa, NULL) ``` 但是,我們通常也可以設置掩碼和標志字段。掩碼是在信號處理程序執行期間使用的臨時信號掩碼。 SA_RESTART 標志將自動重啟一些(但不是全部)系統調用,否則這些調用將提前返回(帶有 EINTR 錯誤)。后者意味著我們可以稍微簡化代碼的其余部分,因為可能不再需要重啟循環。 ```c sigfillset(&sa.sa_mask); sa.sa_flags = SA_RESTART; /* Restart functions if interrupted by handler */ ``` ## 我如何使用 sigwait? Sigwait 可用于一次讀取一個待處理信號。 `sigwait`用于同??步等待信號,而不是在回調中處理它們。下面顯示了多線程程序中 sigwait 的典型用法。請注意,首先設置線程信號掩碼(并且將由新線程繼承)。這可以防止信號被 _ 傳遞 _,因此它們將保持掛起狀態,直到調用 sigwait。還要注意 sigwait 使用相同的 set sigset_t 變量 - 除了設置阻塞信號集之外,它被用作 sigwait 可以捕獲和返回的信號集。 編寫自定義信號處理線程(例如下面的示例)而不是回調函數的一個優點是,您現在可以使用更多的 C 庫和系統函數,否則這些函數無法在信號處理程序中安全使用,因為它們不是異步的信號安全。 基于`http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_sigmask.html` ```c static sigset_t signal_mask; /* signals to block */ int main (int argc, char *argv[]) { pthread_t sig_thr_id; /* signal handler thread ID */ sigemptyset (&signal_mask); sigaddset (&signal_mask, SIGINT); sigaddset (&signal_mask, SIGTERM); pthread_sigmask (SIG_BLOCK, &signal_mask, NULL); /* New threads will inherit this thread's mask */ pthread_create (&sig_thr_id, NULL, signal_thread, NULL); /* APPLICATION CODE */ ... } void *signal_thread (void *arg) { int sig_caught; /* signal caught */ /* Use same mask as the set of signals that we'd like to know about! */ sigwait(&signal_mask, &sig_caught); switch (sig_caught) { case SIGINT: /* process SIGINT */ ... break; case SIGTERM: /* process SIGTERM */ ... break; default: /* should normally not happen */ fprintf (stderr, "\nUnexpected signal %d\n", sig_caught); break; } } ```
                  <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>

                              哎呀哎呀视频在线观看