나는 한때 쉘이 작업 제어를 지원하는 경우에만 "포그라운드" 및 "백그라운드" 프로세스(그룹)의 개념을 가질 수 있다고 생각했습니다. 그러나 나는 이것이 사실이 아님을 암시하는 구절을 읽었습니다.
~에서아푸에제10.3조:
이 신호 상태 동작의 구체적인 예는 대화형 쉘이 백그라운드 프로세스에 대한 인터럽트 및 종료 신호를 처리하는 방법입니다.작업 제어를 지원하지 않는 셸 사용, 백그라운드에서 프로세스를 실행할 때,좋다
cc main.c &
쉘은 백그라운드 프로세스의 인터럽트 및 종료 신호 처리를 무시하도록 자동으로 설정합니다. 이는 중단 문자를 입력해도 백그라운드 프로세스에 영향을 주지 않도록 하기 위한 것입니다.이것이 완료되지 않고 인터럽트 문자를 입력하면 포그라운드 프로세스뿐만 아니라 모든 백그라운드 프로세스도 종료됩니다.
그런데 위의 예를 생각해보면,
이것이 완료되지 않고 인터럽트 문자를 입력하면 포그라운드 프로세스뿐만 아니라 모든 백그라운드 프로세스도 종료됩니다.
이는 또한 포그라운드 프로세스와 백그라운드 프로세스가 동시에 동일한 터미널에 연결될 수 있음을 나타내는 것으로 보입니다. 이거 진짜야? 터미널은 포그라운드 프로세스(그룹)에만 붙일 수 있다고 늘 생각했기 때문이다.
답변1
FWIW, "백그라운드 프로세스" [1], "제어 터미널" [2] 및 셸의 연산자와 같은 개념은 &
4.1BSD에만 등장한 작업 제어 개념보다 앞서 있습니다.
작업 제어가 구현되고 표준화된 후 작업 제어가 없는 셸의 백그라운드 프로세스 동작은 일종의 "작업 제어 라이트"로 분석될 수 있습니다. 여기서 및는 무시되고 SIGINT
표준 입력은 파이프에서 리디렉션되어 SIGQUIT
작업을 시작합니다. 어떤 종류의 모방에 대한 배경 작업의 동작(그러나 정확히 거기에는 없음 ;-))./dev/null
&
이는 또한 포그라운드 프로세스와 백그라운드 프로세스가 동시에 동일한 터미널에 연결될 수 있음을 나타내는 것으로 보입니다. 이거 진짜야? 터미널은 포그라운드 프로세스(그룹)에만 붙일 수 있다고 늘 생각했기 때문이다.
작업 제어가 없는 셸에서는 동기("포그라운드") 또는 비동기("백그라운드") 여부에 관계없이 모든 프로세스가 실제로 동일한 프로세스 그룹(작업)에서 실행되며, 셸 프로세스의 경우와 마찬가지로 백그라운드 또는 포그라운드 작업이 가능합니다. 터미널.
이러한 모든 프로세스는 예를 들어 SIGINT
쉘 자체가 포그라운드 프로세스 그룹에 있고 터미널 ^C
에서 입력이 수행되면 해당 "백그라운드 모드"는 신호를 무시하여 시뮬레이션됩니다 SIGINT
. 마법나머지명령이 &
쉘 스크립트에서 시작되면 자체 SIGINT
핸들러가 설치됩니다.
일반적으로 쉘 스크립트가 실행됩니다.아니요set -m
이 옵션을 사용 하지 않는 한 작업 제어 .
[1] "초보자를 위한 Unix"의 "The Shell" 장을 참조하세요.책,부분유닉스 v6 배포(1975).
[2]"타자기 조종하기"에서죽이다(2)Unix v6에 대한 동일한 맨페이지입니다.