프로세스 실행에는 2가지 방법이 있다.
이 프로그램을 실행하면 "--> After exec function\n"은 출력되지 않는다.
이유는 execlp 호출 하면서 기존 프로그램은 중지되고 ls 프로세스가 기존 프로그램의 메모리 영역을 덮어 쓴다.
기존 프로그램이 중지 되었기에 더 이상 기존 프로세스의 진행이 불가능 하여 다음 출력을 할 수 없다.
execlp 호출시 2번째 인자에 ls를 다시 넣는 이유는 argv[0]는 실행한 프로그램 이름이기 때문이다.
#include <unistd.h>
pid_t fork(void);
fork() system call : 자신을 복제(메모리 복사)해 새로운 process를 생성(Child process)한다.
부모와 자식 프로세스의 수행은 동시 진행된다(독립적으로 실행 됨, 같은 program binary 수행)
성공적으로 호출하면 부모 프로세스는 자식 프로세스의 PID를 반환받고 자식 프로세스는 0을 반환 받는다.
병렬 처리에 사용하기에 좋을 것이다.
int main(void) {
pid_t pid;
switch (pid = fork()) {
case -1:
// error
break;
case 0: // child process handling
printf("pid:%d, ppid:%d\n", (int)getpid(), (int)getppid());
if (execlp("ls", "ls", "-a", (char*)NULL) == -1) {
perror("execlp");
exit(1);
}
break;
default: // parent process handling
printf("pid:%d, ppid:%d, child pid:%d\n", (int)getpid(), (int)getppid(), (int)pid);
break;
}
return 0;
}
execlp("ls", "ls", "-a", (char*)NULL)를 호출하여 자식 프로세스는 ls로 대체된다. 현실적인 자식 프로세스 사용버이다.
Process가 종료 되면, 어떻게 종료 되었는지를 exit status에 저장
child process의 종료 상태를 parent process로 전달 가능
#include <stdlib.h>
void exit(int status);// status : 전달할 exit status
status & 0377(8진수)이 부모에게 전달됨
atexit(3)
에 등록된 함수들을 등록 역순으로 수행_exit(2)
호출 : 이후 종료 과정은 kernel이 수행.여러개의 프로세스들이 존재. 프로세스들은 서로 독립적으로 동작. 공유 자원 또는 데이터가 있을 떄, 문제 발생 가능
프로세스 들이 서로 동작/정보/순서를 맞추는것
종료 되었지만, 아직 삭제되지 않은 프로세스
부모 프로세스보다 먼저 종료된 경우, zombie state가 됨
부모 프로세스가 exit status를 얻어 갈 때까지 zombie process로 남아 있는다.
-> 결정적 이유
#include <sys/typees.h>
#include <sys/wait.h>
pid_t wait(int *status);
자식 process가 종료 할 떄까지 대기. Child process가 종료 하면 exit status를 얻어 옴
child process가 여러 개인 경우, 그 중 하나 가장 빨리 종료 된 것의 exit status를 얻어 옴
Return = -1 : 실행 중인 자식이 없음
status 값 구조
Ex
int main(void) {
pid_t pid;
switch (pid = fork()) {
case -1:
// error
break;
case 0: // child process handling
printf("pid:%d, ppid:%d\n", (int)getpid(), (int)getppid());
exit(2);
break;
default: // parent process handling
int status;
while (wait(&status) != pid)
continue;
printf("status(%d, %x)\n", status, status);
printf("child process exit status : %d\n", WEXITSTATUS(status));
break;
}
return 0;
}
특정 pid를 지정할 수 있는 API도 제공한다
#include <sys/typees.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
pid : 대상 process의 pid
< -1
: -pid => PGID로 해석하여 특정 PGID를 가지는 process= 0
: Child process중 자식과 같은 PGID를 가지는 process중 하나= -1
: Child process들 중 하나> 0
: 특정 child process의 pidoption