[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;
}