SIGTSTP, SIGTTIN 및 SIGTTOU에 대한 "트랩 명령"을 재정의할 수 없습니다.

SIGTSTP, SIGTTIN 및 SIGTTOU에 대한 "트랩 명령"을 재정의할 수 없습니다.

SIGTSTP 신호를 포착하고 싶지만 그럴 수 없습니다. trap인수 없이 명령을 호출하면 다음과 같은 결과가 나타납니다.

trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU

분명히 광산에는 미리 trap정의된 동작이 있습니다. 문제는 루트로 로그인하더라도 이를 무시할 수 없다는 것입니다. 이 명령을 사용하면 trap이 세 가지 신호가 무시됩니다. 그렇지 않으면 잘 작동합니다.

다음과 같은 명령을 통해 다시 작성해 보았습니다.

trap -- 'echo SIGTSTP' SIGTSTP

또 다른 이상한 점은 이러한 신호를 사용할 수 있고 올바르게 작동하며 무시되지 않는다는 것입니다. 간단히 SIGTSTP를 사용하여 다른 프로세스의 작업을 중지하고 SIGCONT를 사용하여 다시 계속하도록 할 수 있습니다.

그렇다면 이 명령을 다시 작성하는 방법을 알고 있나요? 이 이상한 행동을 설명할 수 있나요?


내 운영 체제는 Lubuntu 15.04이고 GNU bash 버전 4.3.30(1) 릴리스(x86_64-pc-linux-gnu)를 사용하고 있습니다.

답변1

Ubuntu 15.04에서 bash를 사용하면 예상대로 작동하는 것 같은데... 스크립트는 어떻게 작성하나요?

#!/bin/bash
set -e
trap 'echo TSTP' TSTP
trap 'echo TTIN' TTIN
trap 'echo TTOU' TTOU
trap
while :; do read a; done # wait forever

세션 예( Ctrl+ 3번 입력 ZCtrl+ C):

$ ./signal.sh
trap -- 'echo TSTP' SIGTSTP
trap -- 'echo TTIN' SIGTTIN
trap -- 'echo TTOU' SIGTTOU
^ZTSTP
^ZTSTP
^ZTSTP
^C

내가 찾은설명서에Bash가 대화형이고 작업 제어가 활성화되면 다음 신호를 무시합니다.

  1. 작업 제어는 기본적으로 활성화되어 있습니다(작업 제어 참조). 작업 제어가 적용되면 Bash는 키보드에서 생성된 작업 제어 신호 SIGTTIN, SIGTTOU 및 SIGTSTP를 무시합니다.

작업 제어를 비활성화할 수 있습니다 set +m. 그러나 bash는 어쨌든 대화형 모드에서 업데이트 핸들러를 허용하지 않습니다.

$ bash -c trap
$ bash -c 'trap true TSTP && trap'
trap -- 'true' SIGTSTP
$ bash -i -c trap
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
$ bash -i -c 'trap true TSTP && trap'
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
$ bash -i -c 'set +m && trap true TSTP && trap'
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU

답변2

어떤 쉘을 사용하고 있는지 언급하지 않았으므로 이것이 쉘의 버그라면 도움을 드릴 수 없습니다.

Bourne Shell 매뉴얼 페이지를 확인하십시오.http://schillix.sourceforge.net/man/man1/bosh.1.html다음 텍스트가 표시됩니다.

     bolic  names. Any attempt to set a trap on a signal that
     was ignored on entry to the current  shell  is  ineffec-
     tive.  An  attempt  to  trap on signal 11 (memory fault)
     produces an error.code here

따라서 모든 것이 괜찮을 수 있지만 쉘은 이러한 신호를 무시하고 호출됩니다.

최신 운영 체제를 사용하는 경우 다음을 호출할 수 있습니다.

 `psig $$`

현재 셸에 대한 신호 처리기를 가져옵니다. $$를 다른 프로세스 ID로 바꿔 다른 프로세스를 확인할 수 있습니다.

관련 정보