簡體   English   中英

終止信號示例

[英]kill signal example

我正在嘗試以下示例: http://www.cs.cf.ac.uk/Dave/C/node24.html

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void sighup(); /* routines child will call upon sigtrap */
void sigint();
void sigquit();

main() { 
 int pid;

 /* get child process */

 if ((pid = fork()) < 0) {
    perror("fork");
    exit(1);
 }

if (pid == 0) { /* child */
   printf("\nI am the new child!\n\n");
       signal(SIGHUP,sighup); /* set function calls */
       signal(SIGINT,sigint);
       signal(SIGQUIT, sigquit);
       printf("\nChild going to loop...\n\n");
      for(;;); /* loop for ever */
 }
else /* parent */
 {  /* pid hold id of child */
   printf("\nPARENT: sending SIGHUP\n\n");
   kill(pid,SIGHUP);
   sleep(3); /* pause for 3 secs */
   printf("\nPARENT: sending SIGINT\n\n");
   kill(pid,SIGINT);
   sleep(3); /* pause for 3 secs */
   printf("\nPARENT: sending SIGQUIT\n\n");
   kill(pid,SIGQUIT);
   sleep(3);
 }
}

void sighup() {
   signal(SIGHUP,sighup); /* reset signal */
   printf("CHILD: I have received a SIGHUP\n");
}

void sigint() {
    signal(SIGINT,sigint); /* reset signal */
    printf("CHILD: I have received a SIGINT\n");
}

void sigquit() {
  printf("My DADDY has Killed me!!!\n");
  exit(0);
}

但是我沒有從子進程中看到任何 output 。

這是預期的行為嗎? 如果是這樣; 為什么?

非常感謝!

您的代碼有一個主要的競爭條件。 在父級發送signal之前,您不能確保子級已完成調用信號。 您要么需要使用某種同步原語使父級等待子級安裝處理程序,要么需要在分叉之前安裝信號處理程序,以便子級繼承它們。

這是我所知道的同步這樣的進程 的最簡單 方法:

  1. 在分叉之前,調用pipe(p)創建一個 pipe。
  2. fork()
  3. 在父級中, close(p[1]); (寫入結束) 和read(p[0], &dummy, 1);
  4. 在孩子中, close(p[0]); close(p[1]); 安裝信號處理程序后。
  5. 當父級從read返回時,您可以確定子級已設置其信號處理程序。 你也可以close(p[0]); 此時在父級中。

編輯 2:也許是一種更好更簡單的方法:

  1. 在分叉之前,調用sigprocmask來阻塞所有信號並保存舊的信號掩碼。
  2. 在父級中,在分叉后立即再次調用sigprocmask以恢復原始信號掩碼。
  3. 在孩子中,在安裝信號處理程序后立即調用sigprocmask以恢復原始信號掩碼。

您應該使用 getpid() 而不是 pid()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM