반응형

 실행 중인 프로세스의 pid와, 부모 프로세스의 pid를 얻어올 수 있는 방법이 없을까요? 각각 getpid 함수와 getppid 함수를 쓰시면 됩니다. 두 개 함수의 원형은 아래와 같습니다.

 


 이제 예제 프로그램을 2개 보도록 하겠습니다.

 

 먼저, 1번째 프로그램입니다. fork 함수로 자식 프로세스를 생성합니다. 그리고, pid가 0이면, 앞에 C를 출력하고, 그것의 프로세스 번호와, 부모의 번호를  출력합니다. 그렇지 않으면, 앞에 P를 출력하고, 프로세스 번호와, 부모 번호를 출력합니다. fork 함수의 리턴값이 0이라면 자식이고, 현재 실행중인 pid 값이면 부모이니, 어떻게 실행이 될 지는 대략 예측이 가능하실 거라고 생각이 듭니다.

 

 

 실행 결과를 봅시다. 그러면 3373번이, 3374번을 생성을 했다는 것을 알 수 있는데요. 3374번의 부모가 3373이 아닌, 1447이 출력이 됩니다. 1447이 무엇이였을까요?

 

 

 뭔가 프로세스인 거 같기는 합니다. 무엇인지는 잘 모르겠지만, 어찌 되었던 번호 3373을 가지는 프로세스가 아님을 알 수 있어요. 이런 일이 왜 일어났는지 잘 생각해 봅시다.

 

 

 fork 함수가 실행이 되면, 두 개의 실행 흐름으로 나누어 지게 됩니다. 정확히는, 프로세스 3373과 자식 프로세스인 3374 이렇게 둘로 나누어 질 겁니다. 그러면, 스케쥴러는 어떤 프로세스를 먼저 실행시킬지 결정을 해야 합니다. 이는, 어떻게 스케쥴링을 하는지에 따라서 다를 겁니다. 3373번이 먼저 실행이 될 수도 있고, 3374번이 먼저 실행이 될 수도 있을 겁니다.

 

 

 3373번, 그러니까 3374번의 부모가 먼저 실행이 되고, main 함수를 종료했다고 해 봅시다. 그러면, 3373이 종료가 되었음에도, 3374번은 살아 있을 겁니다. 이 상황에서, child process가 print C 를 한다고 하면, 자기 자신의 프로세스 번호인, 3374는 출력이 될 거에요. 그런데 이미 부모는 없는 상황입니다.

 

 

 그러니, getppid를 호출하면 3373이 출력되지 않습니다. 대신 systemd의 pid 값인 1417이 출력됩니다.

 

 


 그러면 자식 프로세스가 print를 할 때, 부모 프로세스 id를 출력할 때, systemd가 아닌, 자기 자신을 생성한 부모의 값이 출력되게 하려면 어떻게 하면 될까요? 그 시점에, 부모가 종료가 되지 않으면 됩니다.

 

 

 wait 함수를 줘서, 종료가 될 때 까지 block을 걸어도 됩니다. 3374가 먼저 수행되었다면, 3373은 3374가 끝날 때 까지 기다립니다.

 

 

 그러면, 3374가 printf를 한 시점에는, 이미 부모 3373이 있는 상태이기 때문에, getppid를 했을 때 3373이 나올 겁니다.

 

 

 혹은 waitpid를 이용해도 됩니다. 이것은 이미 pid라는 번호를 가지는 자식이 종료되었어도, WNOHANG 옵션을 주면 기다리지 않고 바로 빠져나옵니다.

 

 

 실행 결과는 위와 같습니다. 3500의 parent가 3499임을 알 수 있고, 프로세스 ./pid2의 pid가 3499임을 알 수 있습니다.

반응형

댓글을 달아 주세요

  1. ㄲ ㅏ누

    그림까지 있어서 이해하기 편하네요
    자바를 조금하긴했는데..
    기억이 잘 안나요ㅠ
    공감 누르고 갈께요~^^