#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]){
printf("hello world (pid:%d)\n", (int) getpid()); int rc = fork();
if (rc < 0) { // fork failed; exit
fprintf(stderr, "fork failed\n");
exit(1);
} else if (rc == 0) { // child (new process)
printf("hello, I am child (pid:%d)\n", (int) getpid());
} else { // parent goes down this path (main)
printf("hello, I am parent of %d (pid:%d)\n", rc, (int) getpid());
}
return 0;
}
prompt> ./p1
hello world (pid:29146)
hello, I am parent of 29147 (pid:29146)
hello, I am child (pid:29147)
prompt>
prompt> ./p1
hello world (pid:29146)
hello, I am child (pid:29147)
hello, I am parent of 29147 (pid:29146)
prompt>
두 결과 중 하나가 나온다. 다른 점은 parent, child의 실행 순서이다.
참고로 fork의 return 값을 rc에 저장해뒀는데,
이 rc가 0보다 작다는 건 어디선가 에러가 있다는 것이고
rc가 0이라는 것은 현재 child 프로세스라는 뜻,
0보다 크면 parent 프로세스라는 것이다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[]) {
printf("hello world (pid %d)\n", (int) getpid());
int rc = fork();
if (rc < 0) {
fprintf(stderr, "fork failed\n");
exit(1);
} else if (rc == 0) {
printf("hello, I am child (pid %d)\n", (int) getpid());
} else {
int wc = wait(NULL);
printf("hello, I am parent of %d (sc:%d) (pid: %d)\n", rc, wc, (int) getpid());
}
return 0;
}
위에서 말했듯이 rc>0 → parent, rc == 0 → child였다.
마찬가지로 wait의 return 값을 wc에 저장해두는데
여기서 wait은 항상 child가 terminated 될 때까지 기다렸다가 child의 status를 반환받기 때문에 부모 프로세스가 먼저 실행되어도 자식 프로세스가 종료될때까지 기다렸다가 자식 프로세스의 pid값을 받으면 wc에 저장한다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main(int argc, char *argv[]) {
printf("hello world (pid:%d)\n", (int) getpid());
int rc = fork();
if (rc < 0) {
fprintf(stderr, "fork failed\n");
exit(1);
} else if (rc == 0) {
printf("hello, I am child (pid: %d)\n", (int) getpid());
char *myargs[3];
myargs[0] = strdup("wc");
myargs[1] = strdup("p3.c");
myargs[2] = NULL;
execvp(myargs[0], myargs);
printf("this shouldn't print out");
} else {
int wc = wait(NULL);
printf("hello, I am parent of %d (wc:%d) (pid:%d)\n", rc, wc, (int) getpid());
}
return 0;
}
만약 fork가 실패하면 rc 값이 음수이므로 fork failed를 출력하고 종료될 것이다.
실패하지 않았다면 새로운 프로세스(child)가 생성이 되고, 프로그램 wc를 실행시키는데, 이 wc는 word count하는 프로그램이다.
마찬가지로 wait 함수를 사용하므로 child process가 먼저 실행되고 terminated를 기다리다가 Parent process가 실행이된다.
child process에서는 execvp 함수를 통해 wc함수에 myargs 인자를 넣고있고, 그 결과값이 위와 같다.