Unix 프로세스는 세션 ID를 가지며 프로세스 그룹의 일부이며 setsid () / getpgrp ()와 같은 함수로 변경 / 쿼리 할 수 있습니다.
그러나 프로세스 그룹과 세션의 개념은 항상 저를 피했습니다. 다른 세션과 프로세스 그룹이 제공하는 중요성을 누구든지 설명 할 수 있습니다. 왜 / 언제 새로운 세션을 생성하거나 여러 프로세스를 동일한 세션 및 / 또는 프로세스 그룹에 배치해야하는지 ?
답변:
프로세스 그룹 한꺼번에 시그널링 될 수 관련 프로세스의 집합이다.
세션 중 (로 알려진 하나의 단말 장치에 부착되어 프로세스 그룹의 모음 제어 단자 어떤 단말기에 부착) 또는 없음.
세션은 작업 제어에 사용됩니다. 세션의 프로세스 그룹 중 하나는 포 그라운드 프로세스 그룹이며 터미널 제어 문자로 신호를 보낼 수 있습니다. 제어 터미널이있는 세션은 해당 터미널의 "로그인"에 해당하는 것으로 생각할 수 있습니다. (데몬은 일반적으로 새 세션을 생성하지 않고 제어 터미널에서 분리합니다.)
예를 들어 some_app
셸에서 실행 하는 경우 셸은 새 프로세스 그룹을 만들고이를 세션의 포 그라운드 프로세스 그룹으로 만듭니다. ( some_app
일부 자식 프로세스를 만들 수 있습니다, 그들은 같은 프로세스 그룹의 일부가 될 것입니다 기본적으로.) 당신은 다음을 눌러 경우 ^Z
, some_app
의 프로세스 그룹이 중지하라는 지시를 내 렸습니다한다; 셸의 프로세스 그룹이 다시 포 그라운드 프로세스 그룹으로 전환됩니다. 그런 다음 예를 들어 의 프로세스 그룹을 다시 bg %1
시작 some_app
하지만 백그라운드에서 계속 실행합니다.
POSIX.1-2008 표준 (! 적어도 난 그렇게 생각) 매우 읽을 - 상기 좀 걸릴 정의 와의 관련 부분 "일반 터미널 인터페이스" 장을.
terminal
및 terminal device
문서 같은 일에 언급?
작업 제어 쉘은 항상 세션 또는 프로세스 그룹을 조작합니다. POSIX kill()
함수에 대한 단일 호출로 프로세스 그룹의 모든 프로세스에 동일한 신호를 보낼 수 있습니다 .
POSIX 표준은 다음과 같이 말합니다.
pid가 0보다 크면 프로세스 ID가 pid와 같은 프로세스로 sig가 전송됩니다.
pid가 0이면 프로세스 그룹 ID가 송신자의 프로세스 그룹 ID와 같고 프로세스가 신호를 보낼 권한이있는 모든 프로세스 (지정되지 않은 시스템 프로세스 세트 제외)에 sig가 전송됩니다.
pid가 -1이면 프로세스가 해당 신호를 보낼 수있는 권한이있는 모든 프로세스 (지정되지 않은 시스템 프로세스 집합 제외)로 sig가 전송됩니다.
pid가 음수이지만 -1이 아닌 경우, 프로세스 그룹 ID가 pid의 절대 값과 같고 프로세스가 신호를 보낼 수있는 권한이있는 모든 프로세스 (지정되지 않은 시스템 프로세스 집합 제외)에 sig가 전송됩니다. .
예를 들어 로그인 쉘이 종료되면 SIGHUP 신호가 해당 프로세스 그룹의 모든 프로그램에 전송됩니다.
프로그램을 포 그라운드 또는 백그라운드로 조작 할 때 프로세스 그룹을 사용하고 있습니다.
걱정할 제어 터미널도 있습니다. 제어 터미널에 의해 생성 된 신호는 프로세스 그룹의 모든 프로그램에 전송 될 수 있습니다.