신호를 받으면 멀티 스레드 Linux 프로세스는 어떻게됩니까?


20

Unix (Posix) 프로세스가 신호를 수신하면 신호 처리기가 실행됩니다.

멀티 스레드 프로세스에서 어떻게됩니까? 어떤 스레드가 신호를 수신합니까?

제 생각에는 신호 API를 처리하도록 확장해야합니다 (즉, 신호 처리기의 스레드를 결정할 수 있어야합니다).하지만 인터넷에서 정보를 찾기 위해 리눅스 커널 메일 링리스트와 1 년 동안 화염을 발견했습니다. 다른 포럼. 내가 이해 한 것처럼 Linus의 개념은 Posix 표준과 다르고 처음에는 일부 compat 계층이 작성되었지만 이제 Linux는 posix 모델을 따릅니다.

현재 상태는 무엇입니까?


3
stackoverflow.com/questions/11679568/…의 중복 "pthreads (7)은 POSIX.1이 신호 처리를 포함하여 프로세스 공유 속성의 모든 스레드를 요구한다고 설명합니다.
steve

@ steve 감사하지만 1) 다른 SE 사이트에 있습니다. 2)이 사양은 명확하게 지정되지 않습니다. 정확히 어떻게 될지. 그것이 의미하는 바, 신호 처리기는 모든 스레드에서 호출 되지만 약간 비현실적입니다. 3)이 답변은 Linus의 모델이 무엇이며 현재 어떻게 / 어떻게 사용되는지를 명시하지 않습니다.
peterh-복 직원 모니카

답변:


9

"Rationale : 시스템 인터페이스 일반 정보"의 " 신호 생성 및 전달 "에 대한 POSIX 항목은 다음 같이 말합니다.

프로세스를 위해 생성 된 신호는 하나의 스레드에만 전달됩니다. 따라서 둘 이상의 스레드가 신호를 수신 할 수있는 경우 스레드를 선택해야합니다. 스레드의 선택은 가장 넓은 범위의 적합한 구현을 허용하고 구현이 서로 다른 스레드간에 쉽게 전달되는 차이가있는 경우 "가장 쉬운"스레드로 신호를 자유롭게 전달할 수 있도록 구현에 전적으로 달려 있습니다.

로부터 signal(7)Linux 시스템 매뉴얼에서 :

프로세스는 전체적으로 (예를 들어를 사용하여 전송 될 때 kill(2)) 또는 특정 스레드 (예를 들어, 특정 기계를 실행 한 결과 생성 된 SIGSEGV 및 SIGFPE와 같은 특정 신호 )에 대해 프로세스에 대해 신호가 생성 (따라서 보류 중) 될 수 있습니다. 언어 명령은 스레드를 통해 지시되며, 신호를 사용하여 특정 스레드를 대상으로하는 신호pthread_kill(3) )를 기준으로합니다. 프로세스 지향 신호는 현재 신호가 차단되지 않은 스레드 중 하나로 전달 될 수 있습니다. 둘 이상의 스레드가 신호를 차단하지 않은 경우 커널은 신호를 전달할 임의의 스레드를 선택합니다.

그리고 pthreads(7) :

스레드에는 별개의 대체 신호 스택 설정이 있습니다. 그러나 새 스레드의 대체 신호 스택 설정은 스레드를 생성 한 스레드에서 복사되므로 스레드는 처음에 대체 신호 스택 (커널 2.6.16에서 수정 됨)을 공유합니다.

pthreads(3)OpenBSD 시스템 의 매뉴얼에서 (대체 접근법의 예로서) :

신호 처리기는 일반적으로 현재 실행중인 스레드의 스택에서 실행됩니다.

(현재 다중 프로세서 컴퓨터에서 여러 스레드가 동시에 실행될 때 이것이 어떻게 처리되는지 알지 못합니다)

POSIX 스레드의 이전 LinuxThread 구현에서는 신호로 별개의 단일 스레드 만 타겟팅 할 수있었습니다. 에서 pthreads(7)리눅스 시스템에서 :

LinuxThreads는 프로세스 지정 신호 개념을 지원하지 않습니다. 신호는 특정 스레드로만 전송 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.