OS 공부 - parent, child, fork, execlp
프로세스 : a program in excution
프로그램이 메모리에 로드된 상태
UNIX 에서
새 프로세스는 fork()라는 시스템 콜에 의해서 생성된다.
child process는 parent 주도공간을 (address space) 복사한다.
parent와 child는 fork() 이후 instruction들을 계속 실행한다.
리턴 코드가 0 이면 child고 pid를 리턴하면 parent다
int main()
{
pid_t pid;
pid = fork();
printf("Hello, Process! %d\n", pid);
}
부모 P0가 실행되고 fork()하면 자식이 만들어지고 둘다 "Hello, Process"한다.
실행결과:
Hello, Process ! 2547
Hello, Process ! 0
부모 프로세스를 기준으로 자식 프로세스를 생성하면 자식 프로세스는 프로세스 번호는 0을 가진다는 것을 알 수 있다.
fork() system call
parent 프로세스의 address space를 그대로 복제하고 parent는 자기 할 일을 계속한다.
자식낳고 wait() 해주면 wait큐로 가서 child가 끝났을때 inturrupt 걸어주기를 기다림 -> child terminated 될때까지 기다림
int main()
{
pid_t pid;
pid = fork();
if (pid > 0) // parent process
wait(NULL);
printf("Hello, Process! %d\n", pid);
}
child는 0이니까 if 실행 안됨
wait 만나면 끝나서 interrupt 걸어 줄 때까지 CPU 반납하고 wait큐 감,
결과:
Hello, Process ! 0
Hello, Process ! 3004
자식 프로세스가 먼저 출력되고 부모 프로세스가 출력됨
int value = 5; // 전역변수
int main()
{
pid_t pid;
pid = fork();
if (pid == 0) { //child process
value += 15;
return 0;
}
else if (pid > 0) { //parent process
wait(NULL);
printf("Parent: value = %d\n", value);
}
}
실행결과:
5
다음과 같이 child가 복사했기 때문에 자식쪽 value가 증가함
복사 할때 이동 ! (fork())
그 이후에 child에서 바뀌는 것은 parent에 영향을 주지 못함
int main()
{
fork();
fork();
fork();
return 0;
}
총 8개의 child 생김, 첫번째 fork되는 순간 프로세스 2개가 되고, 그 두 개가 다음 fork() 하고, 4개가됨, 그 4개가 또 fork하면 8개.
int main()
{
int i;
for (i = 0; i< 4; i++)
fork();
return 0;
}
프로세스 16개생김 (2의 4제곱) fork 네번했으니깐
execlp
a.out 프로그램을 실행시켰다. fork를해서 메모리공간을 복사했는데, 난 b.out을 실행시키고싶다.
execlp써주면 그 공간을 b.out으로 덮어 씀
execlp에 의해 ls 가 실행되는데, 그 밑에 printf("LINE J")는 실행안됨
덮어 써졌기 때문에, instruction들 다 없어짐
int main()
{
pid_t pid;
pid = fork();
if (pid == 0) {
execlp("/bin/ls", "ls", NULL); // ls프로그램으로 덮어써짐, 실행됨
printf("LINE J\n"); // 얘는 덮어써졌기때문에 실행안됨
}
else if (pid > 0){
wait(NULL);
printf("Child Complete\n");
}
return 0;
}
int main()
{
prid_t pid, pid1;
pid = fork();
if (pid == 0) { // child process
pid1 = getpid(); // 자기 pid 가짐
printf("child: pid = %d\n", pid); // 0
printf("child: pid1 = %d\n", pid1); // child자기 pid
}
else if (pid > 0) {
pid1 = getpid();
printf("parent: pid = %d\n", pid); // 자식 pid
printf("parent: pid1 = %d\n", pid1); // parent자기 pid
wait(NULL);
}
return 0;
}
실행결과:
parent pid = 5157
parent pid1 = 5156
child pid = 0
child pid = 5157