/dev/stdin에서 읽은 명령이 백그라운드로 전송될 때 "[1]+Stopped" 상태를 얻는 이유는 무엇입니까?

/dev/stdin에서 읽은 명령이 백그라운드로 전송될 때 "[1]+Stopped" 상태를 얻는 이유는 무엇입니까?

다음 명령을 실행해 보았습니다.

  • cat
  • base64 /dev/stdin
  • md5sum /dev/stdin
  • tail /dev/stdin

내가 이 작업을 수행하는 모든 경우에:

^Z
$ bg
$ jobs

내가 얻는 상태는 [1]+ Stopped다음과 같습니다 [1]+ Running.

그러나 파이프에서 읽으면 작업이 실행 중인 것으로 간주됩니다.

mkfifo /tmp/fifo1

cat /tmp/fifo1
^Z
$ bg
$ jobs

# [1]+  Running                 tail /tmp/fifo1 &


/dev/stdin읽기 명령이 Stopped백그라운드로 전송된 것으로 간주되는 이유는 무엇 입니까?

답변1

이것은 의도적으로 설계된 것입니다. POSIX 작업 제어가 설계된 방식입니다.

POSIX 작업 제어에는 여러 작업(프로세스 그룹에 배치된 프로세스로 표시됨)과 연결된 TTY 장치("제어 TTY")가 있습니다. 한 번에 하나의 프로세스 그룹은 포그라운드 프로세스 그룹이고 나머지는 백그라운드 프로세스 그룹입니다.

백그라운드 프로세스 그룹의 프로세스가 제어 터미널에서 데이터를 읽으려고 시도하면 신호를 받고 SIGTTIN중지됩니다.

SIGTTOU백그라운드 프로세스 그룹이 수신 할 수도 있습니다.쓰다터미널로 가세요. 이 동작이 적용되는지, 즉 백그라운드에서 쓰기가 허용되는지 여부를 제어하는 ​​TTY 플래그가 있습니다. (이 플래그를 설정하거나 지우는 명령 인터페이스는 stty tostop/ 입니다 stty -tostop.)

아이디어는 백그라운드 프로세스가 TTY 입력을 훔칠 수 있다면 정말 엉망이 될 것이라는 것입니다. 키 입력은 백그라운드 프로세스에 무작위로 배포됩니다. POSIX 작업 제어는 혼란을 방지하기 위해 교통 경찰관처럼 프로세스뿐만 아니라 TTY 입력(및 가능한 경우 출력)도 처리합니다.

관련 정보