簡體   English   中英

Signal和SIGCHLD,它有什么作用?

[英]Signal and SIGCHLD, what does it do?

我被要求找到這個問題的所有可能的輸出:

#define N 4
int val = 9;
void handler(sig) {
   val += 3;
   return;
}
int main() {
  pid_t pid;
  int i;
  signal(SIGCHLD,handler);
  for (i=0;i<N;i++) {
    if ((pid =fork()) == 0) {
        val -= 3;
        exit(0);
    }
  }
  for (i=0;i<N;i++) {
    waitpid(-1,NULL,0);
  }
  printf("val = %d\n",val);
}

我不知道行信號(SIGCHLD,處理程序)做什么。 我只發現以下內容:

SIGABRT - abnormal termination.
SIGFPE - floating point exception.
SIGILL - invalid instruction.
SIGINT - interactive attention request sent to the program.
SIGSEGV - invalid memory access.
SIGTERM - termination request sent to the program.

SIGCHLD是做什么的? 您也可以在這個問題中解釋for循環嗎?

我需要哪些必要的庫來編譯和運行此代碼?

當您從父進程派生子進程時,會設置SIGCHLD,但不會執行處理程序功能。 子項退出后,它將觸發SIGCHLD並因此導致處理程序函數中的代碼執行...

奇怪的程序。

我想向您展示的是SIGCHLD導致的原因以及子進程更改子進程中的變量對父級沒有影響。

當fork()時,您將創建一個子進程。 聽起來有點熟? 父進程(稱為fork()的進程)接收信號。 處理程序被執行。 當您運行程序時,您應該會看到21。

這是因為每次信號處理程序執行9 +(3 * 4)= 21時,val都會增加3。 該代碼創建了四個子代。

子進程

val-= 3; 退出(0);

遞減值 但是因為這是在另一個進程中發生的,而不是在原始子進程中發生的,所以它沒有接觸“原始” val變量,因為它具有自己的本地副本。

我相信@jim mcnamara的答案不會列出所有可能的輸出。

1 <= k <= 4的9+(3 * k)應該是可能的,因為多個信號可以折疊為一個。

暫無
暫無

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

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