터미널의 stdin에서 데이터를 읽는 파이프에 여러 프로세스가 있을 수 있습니까?

터미널의 stdin에서 데이터를 읽는 파이프에 여러 프로세스가 있을 수 있습니까?

터미널에서 파이프라인을 실행한다고 가정해 보겠습니다.

$ a | b

터미널에서 두 프로세스 모두에 신호를 보낼 수 있는 방법이 있습니까? 아니면 두 프로세스 중 하나의 터미널에서만 표준 입력을 읽을 수 있습니까?

b다음을 사용하여 표준 입력에서 읽을 수 있습니다 .

open /dev/tty

a그러나 이로 인해 내 테스트에서 stdin을 읽지 못하는 것 같습니다 . 왜?

기본적으로 파이프 ctrl로 보내거나 stdin에서 읽을 때 c신호 가 수신 되지 않습니다(내 테스트에 따르면).ctrldba

답변1

  1. Ctrl-C와 같은 신호는 stdin을 통해 전달되지 않는다는 점을 명확히 해야 합니다. 터미널에 Ctrl-C를 입력하면 "Ctrl"과 "C"는 2개의 원시 문자로 프로세스에 직접 전달되지 않으며 tty 드라이버는 이를 SIGINT 신호로 해석하고 신호를 전경 프로세스 그룹에 보냅니다.

  2. 실행 중에 Ctrl-C를 입력하면 a | b두 프로세스 모두 SIGINT 신호를 수신합니다. 이를 테스트하려면 명령이 실행되는 동안 Ctrl-C를 입력하면 됩니다.

tail -f /var/log/syslog | grep some_pattern

두 프로세스가 모두 중단되었음을 의미하는 쉘 프롬프트가 즉시 표시됩니다.

어때요?

  • 쉘에 로그인한 후 다음을 입력하십시오.회의, 셸에서 실행되는 모든 프로그램은 이 세션에 속합니다.

  • 세션은제어 터미널, 일반적으로 키보드에서 입력을 받아 화면에 출력합니다. 이 세션의 프로세스는 제어 터미널에서 stdin을 읽고, stdout 및 stderr을 제어 터미널에 쓰고, 제어 터미널로부터 신호를 받습니다.

  • 쉘 파이프에 연결된 프로세스는 프로세스 그룹을 형성합니다. 예를 들어:

proc1 | proc2 &

또는 좋아한다

proc3 | proc2 | proc5
  • 세션은 하나를 가질 수 있습니다포그라운드 프로세스 그룹그리고 하나 이상의백그라운드 프로세스 그룹. 쉘을 차단하고 전경 화면을 차지하는 프로세스 그룹은 전경 프로세스 그룹입니다. 그리고 실행되는 프로세스 그룹은 &백그라운드 프로세스 그룹이 됩니다.

  • 제어 터미널에 "Ctrl-C"와 같은 시퀀스를 입력할 때마다 신호는 전경 프로세스 그룹의 모든 프로세스로 전송됩니다.

답변2

많은 것을 혼합하고 있습니다. 표준 입력, 출력, 오류 파일 설명자(fds) 및 터미널 fd는 동일한 것이 아닙니다.

터미널을 열고 명령을 입력하면 기본적으로 이 3개의 fd(stdin(0), stdout(1), stderr(2))가 터미널을 "지정"하지만 이러한 fd 중 하나(예: "ls")를 리디렉션할 수 있습니다. non_existing_file 2>err"는 오류 메시지를 "err" 파일로 리디렉션하며 터미널에는 표시되지 않습니다.

이제 "open /dev/tty" 줄을 지정하고 싶습니다. 이 줄은 실제로 터미널을 가리키며 차이점을 보여주기 위해 이 샘플 프로그램을 확인하세요. 여기에 이미지 설명을 입력하세요. 파이프라인의 작동 방식에 대해 간략하게 설명하겠습니다.

두 개의 명령을 파이프하면("<" 또는 ">" 없이) 첫 번째 명령은 키보드에서 입력을 받아(입력을 읽어야 하는 경우) 출력을 두 번째 명령의 입력으로 리디렉션합니다. 프로세스 "b"의 표준" 입력은 더 이상 터미널이 아니라 프로세스 "a"의 출력입니다.

위키피디아에서

이제 마지막으로 귀하의 질문에 답하려면 다음 두 가지를 더 알아야 합니다.

1) 포그라운드에서 프로세스를 시작하면 쉘은 해당 프로세스에 터미널 제어 권한을 부여하고 프로세스가 완료될 때까지 기다렸다가 터미널 제어권을 다시 가져오며 키보드에서 생성된 신호는 해당 프로세스로 전송됩니다. 실행 중 프로세스를 제어합니다.

2) 파이프 명령(cmd1 | cmd2)을 시작하면 쉘은 먼저 2개의 프로세스를 동일한 "프로세스 그룹"에 넣습니다(자세한 내용은 작업 제어를 참조하세요). 따라서 "a|b"의 경우 두 프로세스가 동일한 프로세스 그룹에 있으므로 키보드에서 생성된 신호가 두 프로세스 모두에 전송됩니다. 키보드에서 생성된 신호는 단일 프로세스가 아닌 전체 프로세스 그룹으로 전송되기 때문입니다. 이것이 귀하의 질문에 대한 답변이 되기를 바랍니다. 불분명한 점이 있으면 언제든지 문의해 주세요.

관련 정보