프로세스그룹 및 세션에 관한 정리를 해봤는데요..

보시고, 덧붙일말씀이나 잘못된점 있으면 짚어주싶시오.
1. 최초 부모프로세스(포크전)는 pid(프로세스식별번호), pgrp(프로세스그
룹식별번호)
가 동일하게 생성(최초프로세스는 프로세스그룹리더가 된다고 함.)
2. fork 후 자식, 재fork후 손자들의 프로세스그룹식별번호가
부모의 프로세스그룹식별번호와 동일 ( 자식프로세스에서 getpgrp로 검사)
3. session id 또한 1,2번 사이에 모두 동일
4. 단말기마다 세션id가 다름(-ksh)
5. kill -9 상대방sessionid 가능(단말기 없어짐)
6. 서로 다른세션(단말기)상에서는 setpgid에 의하여
상대방 단말기(세션)에 속한 프로세스
그룹식별번호로 변경할수없다.
7. 그러나 , 동일세션에 속한 프로세스들사이에 먼저 실행한 백그라운드
프로세스의 그룹식별번호로
나중에 실행되는 foreground 프로세스가 프로세스 그룹식별번호를 바꿀수
있었다.
나중에 실행되는 포그라운드 프로세스는 그룹식별번호가 변경되는 순간 더
이상 프로세스그룹리더가
아니다.
8. 손자프로세스에서 setpgid( 0 , 0 )를 함으로써 손자프로세스가 프로세
스그룹리더가 되버렸다.
그것은 동시에 손자프로세스id와 동일한 프로세스그룹이 생성되는것이며
그 프로세스그룹리더가 되는것이다.
첫번째 인수0은 호출프로세스 pid를 가리킴.
두번째 인수 pgid가 첫번째 인수와 동일하면 프로세스그룹리더가 된다고
함.
setpgid( pid ,pgid)
pgid가 0이면 pid에 표시되는 프로세스식별번호가 프로세스그룹식별번호
가 되는것이라함
(프로세스 새그룹생성)
9. setsid()를 통해 새로운 세션 및 프로세스 그룹이 생성될것이다.
그 세션ID 및 프로세스그룹ID는 호출프로세스id와 동일한것이 된다.
또한 생성된 세션은 제어단말기를 갖지 않는다.
그러나, setsid 호출프로세스가 이미 프로세스그룹리더일경우 호출은 실패
한다.
10.프로세스 그룹ID 및 세션ID는 fork()에 의해 생성된 자식프로세스에게
계승된다.
참고소스입니다.
#include
#include
#include
#define prt(TITLE) fprintf(stderr , TITLE " pid[%d] ppid[%d] pgrp[%
d] sid[%d]\n" , \
getpid() , getppid() , getpgrp() , getsid
(0) )
int main(int argc , char *argv[])
{
pid_t pid , pid1 , pgid = 0;
if ( argc == 2 ) pgid = atoi(argv[1]);
prt("start");
pid1 = setpgid( 0 , pgid ); /* process group change */
if ( pid1 == -1 ) perror("setpgid fail");
if ( argc == 2 ) prt("after setpgid ");
pid = fork();
if ( pid < 0 )
{
perror("fork fail");
exit (1);
}
else if ( pid == 0 ) /* Child */
{
prt("child ");
pid1 = fork();
if ( pid1 == 0 )
{
prt("grand child ");
/* I'll become Process group leader */
pid1 = setpgid( 0 , 0 );
prt("after setpgid( 0 , 0) ");
}
}
else
{
/* Parent Process */
sleep(1);
}
return 0;
}
~
댓글 달기