- fork ( ) 의 필요성
execvp 를 이용하여 프로그램을 실행시킬 때 완전히 새로운 프로그램이 실행된다.
따라서 fork ( ) 를 이용해 각각 별도의 2개의 프로그램을 실행시켜 기존 프로그램 또한 실행되도록 한다.
- fork ( ) 는 자기 자신을 복제한다.
- 복제 후 부모 프로세스와 자식 프로세스로 나뉜다.
- 복제된 새로운 프로세스는 부모 프로세스와 같은 코드와 데이터를 가진다.
- fork ( ) 리턴값은 -1 이면 실패
0 이면 자식 프로세스
그외이면 부모 프로세스
- fork ( ) 의 작동원리
/* forkdemo1.c * shows how fork creates two processes, distinguishable * by the different return values from fork() */ #include <stdio.h> #include <unistd.h> void main(void) { int ret_from_fork, mypid; mypid = getpid(); printf("Before: my pid is %d\n", mypid); ret_from_fork = fork(); //자식 생성 sleep(1); printf("After: my pid is %d, fork() said %d\n", getpid(), ret_from_fork); }
$ ./ forkdemo1
Before : my pid is 4170 // 부모 실행
After : my pid is 4170, fork() said 4171 //자식 실행
After : my pid is 4171, fork() said 0 //부모 코드
출력값이 3개인데 이는 1초 기다린후 부모 프로세스가 실행한 코드이다.
- wait ( ) 의 작동원리
일반적으로 부모 프로세스와 자식 프로세스는 동시적으로 작동하므로 자료가 꼬일 수 있다.
이를 위해 부모 프로세스는 자식 프로세스가 끝날 때 까지 기다릴 필요가 있다.
이 경우 wait ( ) 를 호출하여 자식이 종료되기를 기다릴 수 있다.
wait |
목적 프로세스 종료 대기 |
헤더 #include <sys/types.h> |
사용법 pid_t result = wait ( int *statausptr) |
인자 statusptr child result |
리턴 값 -1 에러 |
유사 시스템콜 waitpid(2), wait3(2) |
wait ( ) 의 인자는 자식의 프로세스의 exit ( ) 의 인자값으로 종료 여부를 알 수 있다.
exit (0) 이면 정상적으로 종료함을 나타내고
exit (0) 이 아닐 경우 종료에 실패함을 나타낸다.
/* waitdemo2.c - shows how parent gets child status */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #define DELAY 5 void main(void) { int newpid; void child_code(), parent_code(); printf("before: mypid is %d\n", getpid()); if ( (newpid = fork()) == -1 ) perror("fork"); else if ( newpid == 0 ) // 자식 child_code(DELAY); else parent_code(newpid); //부모 } /* * new process takes a nap and then exits */ void child_code(int delay) { printf("child %d here. will sleep for %d seconds\n", getpid(), delay); sleep(delay); printf("child done. about to exit\n"); exit(17); } /* * parent waits for chiild then prints a message */ void parent_code(int childpid) { int wait_rv; /* return value from wait() */ int child_status; int high_8, low_7, bit_7; wait_rv = wait(&child_status); printf("done waiting for %d. Wait returned: %d\n", childpid, wait_rv); high_8 = child_status >> 8; /* 1111 1111 0000 0000 */ low_7 = child_status & 0x7F; /* 0000 0000 0111 1111 */ bit_7 = child_status & 0x80; /* 0000 0000 1000 0000 */ printf("status: exit=%d, sig=%d, core=%d\n", high_8, low_7, bit_7); }
$ ./waitdemo2 &
$ before : mypid is 10857
child 10858 here. will sleep for 5 seconds
kill 10857
$ done wailting for 10858. Wait returned : 10858
status : exit = 0; sig=15. core = 0
cf) sig = 15 --> SIGTERM kill 시그널
- 쉘(Shell)의 작동 원리
[프로그래밍/시스템 프로그래밍] - [리눅스 시스템 프로그래밍] 쉘 (shell)