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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] # SIGCHLD信號 ## SIGCHLD信號產生的條件 1) 子進程終止時 2) 子進程接收到SIGSTOP信號停止時 3) 子進程處在停止態,接受到SIGCONT后喚醒時 ## 如何避免僵尸進程 1) 最簡單的方法,父進程通過 wait() 和 waitpid() 等函數等待子進程結束,但是,這會導致父進程掛起。 2) 如果父進程要處理的事情很多,不能夠掛起,通過 signal() 函數人為處理信號 SIGCHLD , 只要有子進程退出自動調用指定好的回調函數,因為子進程結束后, 父進程會收到該信號 SIGCHLD ,可以在其回調函數里調用 wait() 或 waitpid() 回收。 ~~~ void sig_child(int signo) { pid_t pid; ? //處理僵尸進程, -1 代表等待任意一個子進程, WNOHANG代表不阻塞 while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) { printf("child %d terminated.\n", pid); } } ? int main() { pid_t pid; ? // 創建捕捉子進程退出信號 // 只要子進程退出,觸發SIGCHLD,自動調用sig_child() signal(SIGCHLD, sig_child); ? pid = fork(); // 創建進程 if (pid < 0) { // 出錯 perror("fork error:"); exit(1); } else if (pid == 0) { // 子進程 printf("I am child process,pid id %d.I am exiting.\n", getpid()); exit(0); } else if (pid > 0) { // 父進程 sleep(2); // 保證子進程先運行 printf("I am father, i am exited\n\n"); system("ps -ef | grep defunct"); // 查看有沒有僵尸進程 } ? return 0; } ~~~ 3)如果父進程不關心子進程什么時候結束,那么可以用signal(SIGCHLD, SIG\_IGN)通知內核,自己對子進程的結束不感興趣,父進程忽略此信號,那么子進程結束后,內核會回收, 并不再給父進程發送信號。 ~~~ int main() { pid_t pid; ? // 忽略子進程退出信號的信號 // 那么子進程結束后,內核會回收, 并不再給父進程發送信號 signal(SIGCHLD, SIG_IGN); ? pid = fork(); // 創建進程 ? if (pid < 0) { // 出錯 perror("fork error:"); exit(1); } else if (pid == 0) { // 子進程 printf("I am child process,pid id %d.I am exiting.\n", getpid()); exit(0); ? } else if (pid > 0) { // 父進程 sleep(2); // 保證子進程先運行 printf("I am father, i am exited\n\n"); system("ps -ef | grep defunct"); // 查看有沒有僵尸進程 } ? 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>

                              哎呀哎呀视频在线观看