2011-04-29 3 views
2

스레드 프로그램을 실행하고 Ctrl + C을 사용하여 주 프로그램을 반복적으로 종료하는 동안 프로그램에서 두 번째 실행시 예기치 않은 결과가 나타납니다. 그러나, 프로그램을 실행시키고 자발적으로 종료 시키면 아무런 문제가 없습니다.Ctrl + C : 메인 프로세스와 함께 스레드도 죽일 수 있습니까?

내 의심은 Ctrl + C입니다. 또한 주 프로세스와 함께 스레드를 죽입니까?

미리 감사드립니다.

답변

2

글쎄, Ctrl + C이하는 일은 신호를 마스킹하지 않는 과정에서 SIGINT하나의 스레드로 보내는 것입니다. 신호는 처리되거나 무시 될 수 있습니다.

일 경우 Ctrl+C을 처리하면 일반적인 동작은 자동 종료되지만 다시 한번 다른 용도로 사용될 수 있습니다.

고객님의 경우 SIGINT 개의 스레드로 접수되어 다른 스레드를 죽이지는 않습니다.

+0

@Heandel을하지만, 상관없이, 갈래의 자식 프로세스가 계속 무슨 소용이 스레드 라이브러리 (그들은 같은 프로세스 그룹에 여전히 한 경우에는 신호가 나타날 수 있지만 자유롭게 무시할 수) : 모든 키를 프로세스 + 스레드를 죽이는 것을 알고 있습니까? – kingsmasher1

+0

@Heandel : 내가 아는 바로는, 사실 나는 모든 리눅스 사용자를 생각합니다. 나는 키 조합을 알고 싶어했습니다. – kingsmasher1

+0

@Heandel : 감사합니다.이 웹 링크가 있습니까? 그렇다면 모든 사용자에게 유용 할 것입니다. – kingsmasher1

3

멀티 스레드 프로그래밍에서 신호는 단일 스레드로 전달됩니다 (일반적으로 특정 신호가 차단되지 않은 스레드 중에서 예측할 수없이 선택됨). 그러나이 은 기본 동작이 프로세스를 종료시키는 신호 인 신호가 하나의 스레드 만 종료한다는 것을 의미하는 것은 아닙니다을 의미하지 않습니다. 사실, 은 전체 프로세스를 죽이지 않고 단일 스레드를 죽일 방법이 없습니다입니다.

SIGINT의 프로세스를 종료하는 기본 동작으로두면 적어도 하나의 스레드가 SIGINT을 차단 해제 한 상태로 유지됩니다. 하나 이상의 스레드에서 차단 해제 된 스레드는 중요하지 않으므로 응용 프로그램의 뒤에서 스레드를 만드는 라이브러리 코드는 항상 pthread_create을 호출하고 나중에 호출 스레드에서 신호 마스크를 복원하기 전에 모든 신호를 차단해야합니다.

+0

감사합니다 "R"은 유용했습니다. – kingsmasher1

1

NPTL 스레드를 사용하는 Linux 2.6에서 : 프로세스가 기본 신호 처리기를 사용하거나 exit()를 호출한다고 가정합니다. 예. C 라이브러리 exit() 호출은 모든 스레드를 즉시 종료하는 exit_group 시스템 호출에 매핑됩니다. 디폴트의 ​​시그널 핸들러는 이것 또는 비슷한 것을 호출한다.

Linuxthreads를 사용하는 Linux 2.4 (또는 응용 프로그램이 여전히 이상한 이유로 Linuxthreads를 사용하는 경우 2.6 사용) : 반드시 그런 것은 아닙니다.

Linuxthreads 라이브러리는 clone()을 사용하여 스레드를 구현하여 주소 공간을 부모와 공유하는 새로운 프로세스를 만듭니다. 부모가 죽으면 반드시 사망하지는 않습니다. 이 문제를 해결하기 위해 pthreads가 생성하는 "마스터 스레드"가 있습니다. 이 마스터 스레드는 다양한 작업을 수행하며, 그 중 하나는 프로세스가 종료 될 때 모든 스레드가 종료되도록 보장하기위한 것입니다 (어떤 이유로 든). 성공할 경우

  1. 그것은 반드시 스레드의 수가 많은 경우 특히, 반드시 즉시 아닌,
  2. 을 성공하지 않습니다.

그렇다면 Linuxthreads를 사용하는 경우 가능하지 않을 수 있습니다.

다른 스레드가 즉시 종료되지 않거나 실제로 종료되지 않을 수 있습니다.

+0

답변을 주셔서 감사합니다. 유용한 정보였습니다. – kingsmasher1

관련 문제