리눅스에서 wait와 waitpid는 프로세스의 종료 상태를 리턴해 주는 함수입니다.

 

 

pid_t waitpid(pid_t pid,int *statloc,int options);

 

 

 성공을 하면, 프로세스 ID를, 오류가 발생하면 -1을, 그 외의 경우에는 0을 리턴합니다. 그런데, 이 함수가 wait와 다른 점은, 특정한 자식 프로세스를 기다리게 할 수 있다는 것입니다.

 

 

 일단 위의 두 옵션만 아셔도 무난할 듯 싶어요. 프로세스 그룹은, 추후에 다시 설명해 드리도록 하겠습니다. 3번째 인자의 옵션이 중요한데요. WNOHANG, WCONTINUED, WUNTRACED 등이 있어요. sleep sort를 설명했을 때, 옵션으로 준 것은 이 중 1번째 것이였는데요. 이 때에는 종료된 자식이 존재하지 않아도, 블로킹 상태에 들어가지 않고, 0을 즉시 리턴합니다. 2번째 인자는 wait 함수와 동일합니다.

 

 


그러면 예제를 하나 봅시다.

 

 

 이 프로그램은 어떻게 수행이 될까요? 일단 fork 함수가 호출이 되었으니, 자식 프로세스가 만들어 질 겁니다.

 

 

 그러면 자식 프로세스는, sleep(24)를 수행하고 있을 겁니다. 만약에 이 때, 부모 프로세스가 메모리에 올라와서, waitpid가 호출이 된다면 어떻게 될까요? 일단 child는 sleep(24)를 수행하고 있으므로, 24초간 종료를 할 수 없습니다. 그런데, 이 때, 이 함수에서 0이 반환됩니다.

 

 

 저는 WNOHANG 옵션을 주었기 때문에, child가 return을 하지 않았다면, 그 즉시 0을 리턴합니다. 그리고 계속 while문을 돌 겁니다. child, 즉 프로세스 번호가 pid인 프로세스가 종료 될 때 까지요.

 

 

 실행 결과는 위와 같습니다. child end가 출력되기 전에도 계속 waiting이 호출이 되고 있었습니다. WNOHANG은 대상이 되는 프로세스가 종료가 되지 않더라도, 그 즉시 값을 리턴합니다.

 

 


 그런데 wait는 이야기가 달라집니다. 예제 2를 봅시다.

 

 

  코드 자체는 똑같습니다. 다만, 밑에 있는 코드가 조금 다른데요.

 

 

 waitpid 대신에 wait를 썼다는 것을 알 수 있어요. 그러면 이 때, 어떤 식으로 될까요? wait 함수는, 임의의 자식이 종료가 될 때 까지 blocking 상태에 있다고 그랬어요. 자식 하나만 생성했는데요.

 

 

 그러면 "child end"가 찍히고, return 0이 될 때 까지, parent의 wait 함수는 리턴되지 않아요.

 

 

 child가 return 0을 하는 순간 wait 함수가 pid를 리턴을 할 거고, waiting과 parent end가 출력될 거에요.

 

 

 실행 결과는 위와 같습니다.