본문 바로가기

[+] Information/[-] Network

[2009/06/24] 좀비 프로세스 예제(zombie.c, wait.c, waitpid.c)

/* zombie.c */

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
  pid_t pid;
  int data=10;

  pid=fork();
  if(pid<0)
    printf("fork 실패 프로세스 id : %d \n", pid);

  printf("fork 성공 프로세스 id : %d \n", pid);

  if(pid==0) /* 자식 프로세스라면 */
    data+=10;
  else       /* 부모 프로세스라면 */
  {
    data-=10;
    sleep(20); /* 20초 동안 정지 상태에 들어간다 */
  }

  printf("data : %d \n", data);
  return 0;
}




/* wait.c */

#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
  pid_t pid, child;
  int data=10;
  int state;

  pid=fork();
  if(pid<0)
    printf("fork 실패 프로세스 id : %d \n", pid);

  printf("fork 성공 프로세스 id : %d \n", pid);

  if(pid==0) /* 자식 프로세스라면 */
    data+=10;
  else       /* 부모 프로세스라면 */
  {
    data-=10;
    child=wait(&state); /* 자식 프로세스의 종료 대기 */
    printf("자식 프로세스 ID = %d \n", child);
    printf("리턴 값 = %d \n", WEXITSTATUS(state));
    sleep(20); /* 프로세스 상태 확인을 위해서 */
  }

  printf("data : %d \n", data);
  return 0;
}





/* waitpid.c */

#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
  pid_t pid, child;
  int data=10;
  int state;

  pid=fork();
  if(pid<0)
    printf("fork 실패, 프로세스 id : %d \n", pid);

  printf("fork 성공, 프로세스 id : %d \n", pid);

  if(pid==0) /* 자식 프로세스라면 */
  {
    data+=10;
    sleep(10); /* 종료를 10초 지연 */
  }
  else       /* 부모 프로세스라면 */
  {
    data-=10;
    do{
      sleep(3);
      puts("3초 대기");
      child=waitpid(-1, &state, WNOHANG);
    }while(child == 0);

    /* 종료한 자식 프로세스 상태정보 출력 */
    printf("Child process id = %d, return value = %d \n\n", child, WEXITSTATUS(state));
  }

  printf("data : %d \n", data);
  return 0;
}