OS 공부

OS 공부 - parent, child, fork, execlp

휘로그 2024. 10. 10. 21:40
728x90
반응형

 

프로세스 : 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

반응형