fork()된 자식 프로세스의 코드 실행 위치

Hyun·2023년 5월 19일
0

fork() 함수는 자식 프로세스를 생성하는 함수이다.
fork() 시 부모 프로세스의 코드, 스택, 힙, 레지스터 값, 프로그램 카운터(pc) 등을 복사해 새로 만든 프로세스에 넣기 때문에 내용은 부모 프로세스와 같다고 할 수있다.

부모 프로세스와 자식 프로세스간의 스케줄링은 OS에 따라 결정되며, 부모 프로세스가 먼저 수행될 수도 있고, 자식 프로세스가 먼저 실행될 수도 있다.

자세한건 나중에 다루고. 헷갈렸던 부분은 아래와 같다

#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30

int main(int argc, char *argv[]){
  int fds[2];
  char str[] = "Self pipe test";
  char buf[BUF_SIZE];
  pid_t pid;
  
  pipd(fds);
  printf("fds[0] = %d, fds[1] = %d\n", fds[0], fds[1]);
  
  //fds[1]을 통해 쓰기
  write(fds[1], str, sizeof(str));
  
  //fds[0]을 통해 읽기
  read(fds[0], buf, BUF_SIZE);
  puts(buf);
  return 0;

나는 처음에 pipe() 함수 호출로 부모 프로세스에서 공유메모리를 만든 후, 자식 프로세스를 생성했을때 자식 프로세스에도 똑같은 코드가 복사되므로 pipe() 함수가 다시 호출되서 자식 프로세스에서도 독립적인 별개의 공유 메모리가 존재해야 하는것 아닌가? 라고 생각했었다.

하지만 fork()를 통해 부모 프로세스의 동일한 값들을 가져오기때문에 프로그램 카운터도 부모 프로세스가 사용했던 값 그대로를 사용한다. 그러므로 자식 프로세스는 fork() 이후의 값만 수행하게 되어 fork() 이전에 있던 pipe() 함수를 호출하지 않는것이다.

profile
better than yesterday

0개의 댓글