컴퓨터 공부/Advanced UNIX System Programming

[5월 7일 1교시] 프로세스 관계 + 데몬 프로세스

려리군 2009. 5. 7. 10:04

BSD 터미널 로그인

1. init프로세스의 자식은 getty 프로그램 실행

2. getty프로그램 : login이름을 받고 login 프로그램 수행.

execle("/usr/bin/login","login","-p",username,(char*)0,envp);

3. login 

 - password를 입력받아 암호화(crypt)하여 /etc/passwd파일과 비교.

 - 패스워드가 맞으면 $HOME변경 및 터미널 소유자를 로그인 한 사용자로 변경

 - 그룹 ID 및 setuid로 로그인 한 사용자로 변경

 - 환경 변수 설정

 - 로그인 쉘 프로그램을 실행

exec("bin/shell","-sh",(char* 0);

init, getty, login 이 수행될 때 사용자 아이디는 0(root)


BSD 네트워크 로그인

super daemon이 클라이언트 접속시 match되는 port를 찾아서 daemon 수행

인터넷 수퍼서버(inetd, xinetd)

TCP/IP 연결 요구가 들어오면 fork하고 해당 프로그램을 exec


프로그램 그룹

 - 일관된 작업을 하는 프로세스들 (foreground, background 구분.)

 - 리더 : 그룹 ID와 동일한 값을 가짐. 그룹 내 프로세스 생성 및 종료 가능.

 pid_t getpgrp(void)

 - 소속 프로세스 그룹 리턴

 int setpgid(pid_t pid, pid_t pgid);

 - 새로운 프로세스 그룹 생성 혹은 존재하는 프로세스 그룹 합류.

 - 성공시 0, 실패시 -1 리턴.


프로세스 세션

프로세스 그룹의 집합

터미널에서 실행되고 있는 프로세스 그룹들

pid_t setsid();

프로세스 그룹 리더가 아니면 새 세션 생성.

연결되어 있던 제어 터미널과 단절.


제어터미널

특수키 입력시 foreground 프로세스들에게 시그널 전달.

모뎀과 연결이 끊어지면 세션 리더에게 hang-up 시그널 전달.

stty -a : 쉘 명령어, meta문자 정보를 본다.(작업제어용)

pid_t tcgetpgrp(int filedes);

터미널에 연결된 foreground 프로세스 그룹 ID 리턴.

int tcsetpgrp(int filedes, pid_t pgrpid);

filedes(세션의 제어 터미널)와 관련된 프로세스 그룹 ID 리턴.


background process groups : 터미널 출력만 가능

the foreground process group : 터미널 입출력 가능.


데몬 프로세스

제어 터미널을 가지지 않음.

보통 부팅시 시작, shutdown시 종료.

네트워크 서버 혹은 OS서비스 프로그램

TTY 값이 모두 "?", PID,PGID,SID가 동일


실행법

초기화 스크립트에 의해 실행

cron(주기적 프로그램 실행),  at(예약프로그램) 명령에 의해 실행.


코딩규칙

1. fork함수 호출하고 부모 프로세스 종료

if((pid = fork())<0)

        return -1;

else if(pid != 0)

        exit(0);

2. setsid()호출, 자식프로세스는 그룹 리더가 아니므로.

setsid();

3. 작업디렉터리는 루트 : 파일 시스템의 unmount방지를 위해.

chdir("/");


에러 로깅

 - 파일, 콘설 터미널, 이메일 등으로 출력