재귀 요청에 대한 신호는 어떻게 되나요?

재귀 요청에 대한 신호는 어떻게 되나요?

프로세스가 느려지면 사람들은 작업을 취소 Ctrl + c하거나 Ctrl + z포기하는 경우가 많습니다. 이 경우 이러한 신호 중 어느 것을 처리할지,첫 번째하나 또는마지막하나? 예신호 처리? 그렇지 않다면 어느 것입니까?무시당하다?

답변1

수신기가 다음 신호가 도착하기 전에 신호 처리를 시작할 시간이 있으면 모든 신호가 순차적으로 처리됩니다.

프로세스가 신호를 수신했지만 이를 처리할 준비가 되지 않은 경우(예: 신호가 마스크되거나 프로세스가 중지된 경우) 커널은 신호를 보류 중으로 표시합니다. 신호가 전달됩니다.

프로세스가 준비되지 않은 상태에서 서로 다른 번호의 여러 신호가 수신되면 모든 신호가 처리됩니다. 신호는 프로세스에 하나씩 전달됩니다. 그들의 배달 순서는 다음과 같습니다.POSIX가 지정되지 않았습니다.;존재하다리눅스, 번호가 매겨져 가장 작은 것부터 전달됩니다(예: 보류 중인 경우 SIGHUP=1이 먼저 전달된 다음 SIGQUIT=2 등).FreeBSD어떠한 보증도 이루어지지 않습니다.

프로세스가 준비되지 않은 상태에서 동일한 번호의 신호가 여러 개 수신되면 신호가 병합될 수 있습니다. POSIX는 무슨 일이 일어나는지 지정하지 않지만 대부분의 unice는 병합됩니다. 예를 들어 를 실행하는 경우 kill -1 234; kill -1 234프로세스 234의 신호 1 핸들러가 한 번 또는 두 번 수신되는지 여부는 234가 첫 번째 신호를 전달하기 위한 타임 슬라이스를 얻는지 여부에 따라 타이밍의 문제입니다.

답변2

신호는 터미널을 통해 입력한 순서대로 커널로 전송됩니다. Ctrl+가 사용되면 커널 C은 SIGINT 신호를 전경 프로세스 그룹으로 보내도록 지시받습니다. 이 메시지를 받은 후 실행 중인 명령이 종료됩니다.

+를 사용하여 SIGSTP 신호를 보내고 있음 Ctrl을 나타냅니다 . Z이는 실제로 프로세스를 종료하는 것이 아니라 단지 일시적으로 중지하라고 지시하는 것뿐입니다. 이 기능을 사용할 때 프로세스를 다시 포그라운드로 가져오도록 쉘에 지시하여 프로세스를 재개하거나 fg명령을 사용하여 백그라운드에 배치할 수 있습니다 bg.

SIGSTP 신호를 통해 작업이 중지된 경우 kill실제로 다음과 같은 명령을 사용하여 작업을 종료할 수 있습니다.

$ kill %1

%1방금 SIGSTP한 작업의 작업 ID는 어디에 있습니까?

중지된 작업 확인

job아래와 같이 다음 명령을 사용하여 셸에서 중지된 작업을 확인할 수 있습니다 .

$ sleep 1000 
^Z
[1]+  Stopped                 sleep 1000
$ jobs
[1]+  Stopped                 sleep 1000

Ctrl여기서는 +를 사용하여 명령을 Z중지합니다 sleep 1000. 위에서 언급한 내용 [1]에 해당하는 출력입니다 . %1이렇게 죽이면 Ctrl+ 와 같은 효과 가 있습니다 C.

$ kill %1
[1]+  Terminated              sleep 1000

fg위에서 언급한 및 명령은 bg숫자 뒤에 더하기 기호가 있는 작업에서 작동합니다. +여기서 출력을 확인하세요 jobs.

[1]+  Stopped                 sleep 1000

다음과 같이 여러 가지 직업을 갖고 있다면 더 분명해질 것입니다.

$ jobs
[1]   Stopped                 sleep 1000
[2]-  Stopped                 sleep 2000
[3]+  Stopped                 sleep 3000

따라서 모든 기본 명령 fg이나 bg명령은 +다음과 같이 특정 대상을 대상으로 할 수 있습니다.

$ fg %1
sleep 1000

관련 정보