zsh: "stty -tostop"이 있어도 백그라운드 프로세스가 중단되는 이유는 무엇입니까?

zsh: "stty -tostop"이 있어도 백그라운드 프로세스가 중단되는 이유는 무엇입니까?

나는 tty에 자유롭게 쓰는 백그라운드 프로세스를 좋아합니다. stty -tostop내 zsh에는 이미 기본값이 있습니다(이유는 모르겠지만 아마도 OhMyzsh 때문일까요?).

❯ stty -a |rg tostop                                                                                                      
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt

하지만 여전히 가끔 백그라운드 프로세스가 일시 중지되는 경우가 있습니다(이는 일관된 동작이 아니며 재현 방법을 모르겠습니다).

[1]  + 3479064 suspended (tty output)

답변1

TCSETSW프로세스가 터미널의 포그라운드 프로세스 그룹에 속하지 않는 경우 TCSETS ioctl()(예: libc 함수를 사용할 때 ), 활성화 tcsetattr()여부에 관계없이 tty 라인 규칙 설정이 설정됩니다(예: 대화형 셸에서 백그라운드에서 호출되는 경우). tostop영향을 미치다쓰다터미널로).

$ stty echo &
[1] 290008
[1]  + suspended (tty output)  stty echo

자세한 내용은 info libc SIGTTOUGNU 시스템을 참조하세요.

  • 매크로: int SIGTTOU

    SIGTTIN이는 백그라운드 작업의 프로세스가 터미널에 쓰기를 시도할 때 와 비슷 하지만 생성됩니다.또는 모드를 설정하세요. 다시 말하지만, 기본 작업은 프로세스를 중지하는 것입니다. 출력 모드가 설정된 경우 SIGTTOU터미널에 쓰려고 할 때만 생성됩니다. TOSTOP

(강조는 내 것)

나는 이것이 이것의 유일한 이유는 아니라고 생각합니다 ioctl(). 리눅스 커널 소스 코드를 대충 살펴보면 TCXONC( tcflow())와 TCFLSH( tcflush())도 같아야 할 것 같습니다.

관련 정보