簡體   English   中英

如何將 SIGINT 用於線程 C

[英]How to use SIGINT for threads C

我正在嘗試將 SIGINT (CNTRL C) 用於線程,但它的行為很奇怪。 我正在嘗試為線程創建者進程設置一個 SIGINT function 並為線程本身設置一個 SIGINT function 。 這是我要實現的示例代碼:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#include <semaphore.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>

pthread_t *cars;
 

void carEnd(){
  printf("Car from team %ld killed.\n",(long)getpid());
  pthread_exit(NULL);
}

void teamEnd(int signum){
  for(int j=0; j<3; j++){

    pthread_join(cars[j],NULL);
  }

  printf("Team %ld killed\n",(long)getpid());
  exit(0);
}

void *carThread(void* team_number){
  signal(SIGINT, carEnd);
  sleep(10);
  pthread_exit(NULL);
  return NULL;

}

int main(){
  signal(SIGINT, teamEnd);

  int workerId[3];

  pthread_t cars[3];

  //Create the car threads
  for(int i=0; i<3;i++){
    workerId[i] = i+1;
    pthread_create(&cars[i], NULL, carThread,&workerId[i]);
  }
  //Waits for all the cars to die
  for(int j=0; 3; j++){
    pthread_join(cars[j],NULL);
  }

  return 0;
}
`

執行后,如果未檢測到 SIGINT,則程序會在 10 秒后關閉。 如果檢測到 SIGINT,則終端上會顯示一條消息“來自團隊的汽車......已死亡”。 如果有人能向我解釋這種行為以及如何解決它以實現我的目標,我將不勝感激!

Ctrl - C指示您的終端向前台進程組發送 SIGINT,這意味着為前台組的每個進程生成一個 SIGINT。

當為進程生成信號時,系統會嘗試將其傳遞給該進程的一個且僅一個線程 在您的示例中,您的所有線程都有資格接收信號,因為沒有一個線程像pthread_sigmask那樣屏蔽(“阻塞”)信號。 系統將選擇其中一個線程進行信號傳遞。

當 SIGINT 被傳遞到線程時,會采取一些稱為信號處置的動作。 重要的是,一個進程在任何給定時間每個信號都可以有一個且只有一個處置 - 最近對signal()sigaction的調用決定了處置。 因此,您的main()線程選擇的teamEnd()的 SIGINT 處置被您的第一個carThread()線程覆蓋以調用signal() ,然后被其中的 rest 冗余覆蓋。

在您的情況下, SIGINT 碰巧在carThread()期間中斷sleep() ,打印您看到的消息,然后喚醒線程,然后終止。


除了上述之外,我真的不能說你應該做什么。 認為您的目標是在 SIGINT 上優雅地終止所有線程。 如果是這樣,我建議您通過強制將信號傳遞到main() ,然后讓該線程指示其他線程通過某些共享標志或條件變量退出來做到這一點。

暫無
暫無

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

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