Friday, April 4, 2008

Sessions and Process groups

간단히 얘기하면 한 시스템에 여러개의 세션이 존재할 수 있고, 세션은 job control의 단위인 여러개의 프로세스 그룹으로 나눠질 수 있는데, 세션과 프로세스 그룹에는 각각 리더가 존재해서 이를 세션 리더, 프로세스 그룹 리더라고 한다. 프로세스 그룹은 foreground/background 로 나누어 진다. 사용자가 터미널을 종료하면 SIGQUIT이, 네트웍이 끊어지면 SIGHUP가, Ctrl-C를 누르면 SIGINT가 foreground process group에 전달된다. 사용자가 세션을 시작하면 그 사용자의 pid가 pgid, sid로 되어 세션 및 프로세스 그룹이 생성된다. 새로운 새션을 시작하기 위해서는 setsid()를 사용하는데, 이를 호출하는 프로세스는 다른 프로세스 그룹의 리더여서는 안된다. 이를 위해 일반적으로 fork()한 후 부모는 종료하고, 자식 르로세스에서 setsid()를 수행해서 새로운 세션을 만든다.

pid_t pid;

pid = fork();

if (pid == -1) perror("fork");
else if (pid !=0) exit(EXIT_SUCCESS);

if (setsid() == -1)
{
perror("setsid");
return -1;
}

현재 세션 id는 비슷하게 getsid()를 통해서 볼 수 있다.(인자에 pid를 주면 다른 프로세스의 sid도 볼 수 있다.) sid에 대한 함수들 같이 pgid도 같은 식으로 set, get할 수 있는데 setpgid(), getpgid()를 통해 볼 수 있다. 리눅스에서는 한 때 이러한 함수들을 setpgrp(), getpgrp()로 제공했었다.

No comments:

Post a Comment