프로세스 프로그래밍 (Process Programming)
프로세스 생성과 종료
함수 |
의미 |
fork |
자신과 완전히 동일한 프로세스를 생성한다. |
exec 계열 |
지정한 실행 파일로부터 프로세스를 생성한다. |
exit |
종료에 따른 상태 값을 부모 프로세스에게 전달하며 프로세스를 종료한다. |
atexit |
exit로 프로세스를 종료할 때 수행할 함수를 등록한다. |
_exit |
atexit로 등록한 함수를 호출하지 않고 프로세스를 종료한다. |
wait |
자신의 자식 프로세스가 종료할 때까지 대기 상태가 된다. |
waitpid |
지정한 자신의 자식 프로세스가 종료할 때까지 대기 상태가 된다. |
프로세스 속성과 환경 변수
함수 |
의미 |
getpid, getppid |
자신(또는 부모)의 프로세스 식별 번호를 구한다. |
getpgrp, setpgrp |
자신의 프로세스 그룹 식별 번호를 구하거나 변경한다. |
getpgid, setpgid |
지정한 프로세스의 그룹 식별 번호를 구하거나 변경한다. |
getsid |
지정한 프로세스의 세션 식별 번호를 구한다. |
setsid |
현재 프로세스가 새로운 세션을 생성한다. |
getenv, putenv |
환경 변수의 값을 구하거나, 새로운 환경 변수를 등록/변경 한다. |
setenv |
새로운 환경 변수를 등록하거나 변경한다. |
unsetenv |
등록된 환경 변수를 삭제한다. |
프로세스 생성 함수
fork: 프로세스를 복제하여 완전히 동일한 자식 프로세스 생성
#include <sys/types.h>
#include <unistd.h>
// pid_t 구조체: pid_t fork(void)
pid_t pid = fork();
if (pid > 0) // 부모 프로세스가 수행할 부분
…
else (pid == 0) // 자식 프로세스가 수행할 부분
…
else // pid < 0? fork 호출이 실패할 경우
…
fork를 사용하는 이유
- 서버는 하나의 서비스 내에서 여러개의 클라이언트를 받아내야 합니다. 그래서 서버의 프로세스가 클라이언트의 요청을 받으면 자신이 응답하는 것이 아니라, 자식을 fork()하여 전달합니다. 간단히 말하면 서버 프로세스가 접속을 받을 때마다 요청을 처리할 프로세스를 만들어 응답하는 것입니다.
- 이 외에도 멀티 태스킹 운영체제에선 동작중인 프로그램 외에도 다른 프로그램을 동작해야할 때가 있습니다. 이를 위해선 새로운 프로세스를 생성해야하고, 그 방법으로 프로세스 자신을 복제하여 프로그램을 호출합니다.
fork로 프로세스를 생성하면...
- 생성하는 쪽이 부모(parent), 생성된 프로세스는 자식 (child)
- 생성된 자식 프로세스는 부모 프로세스의 메모리를 그대로 복사하여 가지게 됩니다.
- 서로 다른 프로세스이다 -> 서로 다른 PID
- 실행 상태는 똑같다.
- fork를 호출하던 시점의 context(실행 상태)를 그대로 물려 받 는다.
- 프로그램 코드
- 변수, 레지스터 값
- 스택의 값 등등
- fork 이후부터는 각자 자기 길을 간다!
return: 반환 값
- fork 호출이 성공하여 자식 프로세스가 만들어지면, 부모 프로세스에서는 자식 프로세스의 프로세스 ID가 반환되고 자식 프로세 스에서는 0을 반환한다.
- fork 호출이 실패하여 자식 프로세스가 만들어지지 않으면, 부모 프로세스에서는 -1이 반환된다.
참고