쉘이 내장 기능을 실행하고 키보드가 신호를 생성할 때 그 신호를 처리하는 것은 무엇입니까?

쉘이 내장 기능을 실행하고 키보드가 신호를 생성할 때 그 신호를 처리하는 것은 무엇입니까?

내가 틀렸다면 정정해주세요:Bash 쉘이 외부 실행 프로그램을 실행할 때, bash 쉘은 포그라운드에서 프로그램을 실행하기 위한 하위 프로세스를 생성합니다. 키를 눌러 생성된 신호가 있는 경우 신호는 다음과 같습니다.보내다자식 프로세스에처리됨프로그램을 통과하세요.

Bash 쉘이 내장 명령을 실행할 때, bash 쉘은 쉘 프로세스의 내장 명령을 포그라운드에서 직접 실행합니다. 어떤 키를 눌러도 생성된 신호가 있는 경우 해당 신호는 다음과 같습니다.보내다쉘 프로세스로? 이것은 것이다다루다신호, 프로그램에 대한 내장 명령 또는 bash? 내장 명령이 자체 신호 처리기를 가질 수 있습니까, 아니면 신호 처리기에 의존해야 합니까 bash?

예를 들어 bash 쉘이 wait포그라운드에서 실행 중일 때 Ctrl-C를 누르면 쉘 프로세스가 SIGINT 신호를 수신하여 waitbash에서 처리합니까? wait자체 신호 처리기가 있거나 의존하는 신호 처리기가 있습니까 bash?

감사해요.

답변1

신호, 내장 명령 프로그램 또는 bash를 처리하는 것은 무엇입니까?

내장 명령이 포함된 프로그램은 bash입니다. 이것이 내장의 정의입니다. 외부 프로그램이 아닌 셸에 내장되어 있습니다.

쉘은 신호를 수신했을 때 수행 중이던 작업에 따라 다르게 반응할 수 있습니다. 그러나 다른 프로세스가 관련되지 않기 때문에 신호를 수신하는 것은 항상 쉘 프로세스입니다.

답변2

/dev/tty*Linux 터미널 장치( , ) 를 이해하는 /dev/pts/*가장 쉬운 방법 은 다음과 같이 생각하는 것입니다.스트리밍 소켓. /dev/tty12예를 들어 이것이 TCP 포트인 것처럼 말입니다 127.0.0.1:8080.

프로세스는 여기에 연결하고, 입력을 받고, 기록하고, 결국에는 연결을 끊습니다. 소켓(터미널)은 여러 프로세스와 연결을 설정할 수 있습니다.

다른 프로세스는그들의 말을 들어라, 일반적으로 터미널 에뮬레이터 프로그램이지만 항상 그런 것은 아닙니다. 문자 터미널의 경우 Linux 커널 자체는 터미널 장치에서 "리스너 데몬" 역할을 합니다.

터미널에는 있지만 소켓에는 없는 "추가 기능":커널은 어떤 프로세스가 연결되어 있는지 추적하고 필요에 따라 신호를 보낼 수 있습니다.. 예를 들어 Ctrl+ 를 누르면 c이런 일이 발생합니다 .

전달된 신호의 자세한 목록을 읽을 수 있습니다.거기답변.

+를 누르면 Ctrl정확히 무슨 일이 일어나나요 c?

이것은아니요이는 마치 누군가가 a키와 같은 일반 버튼을 누른 것과 같습니다. 이 경우 누른 키는 단순히 터미널 장치에 기록되며 터미널 장치에서 읽는 프로세스(일반적으로 포그라운드 프로세스)에 의해 읽을 수 있습니다.

Ctrl+ 와 같은 특수 키를 누르거나 터미널 창을 닫거나 크기를 조정하는 경우 z터미널은 요청을 수신하고 커널은 연결된 모든 프로세스에 적절한 신호를 보냅니다.그들 모두에게, 나중에 중요해질 것입니다.

ioctl()이러한 장치는 직접 통화를 통해 제어 할 수도 있습니다 .

Bash가 하위 프로세스(즉, 외부 명령)를 실행하면 다음이 발생합니다.

  1. bash는 백그라운드에서 프로세스를 시작하고 터미널에 제공합니다.
  2. bash가 터미널에서 입력을 받는 것을 중지합니다.
  3. 프로세스가 중지되면 bash는 모든 것을 복원합니다.

그러나 bash는 여전히 터미널 장치에 연결되어 있으며 Ctrl+가 나타나면 신호를 수신합니다 c. 외부 명령도 신호를 수신합니다.

그러나 이러한 신호는 재정의될 수 있습니다( signal()시스템 sigaction()호출). Bash는 이를 재정의합니다. 즉, 기본 신호 처리 루틴을 자체 루틴으로 덮어씁니다(단순히 중지됨). 그렇기 때문에 명령 프롬프트에서 +를 눌러도 Ctrl종료되지 않습니다.c

그러나 a는 sleep 60종료됩니다. 신호 처리기는 변경되지 않습니다.

bash 내부 명령을 실행하면 이 신호 처리기는 말한 대로 작동합니다(내부 명령 실행을 중지하고 프롬프트로 돌아갑니다).

관련 정보