/* 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;
}
'[+] Information > [-] Network' 카테고리의 다른 글
[2009/09/24] 시그널 핸들링 예제소스(sigint.c, sigint2.c, sigalrm.c, zombie_handler.c) (0) | 2009.06.24 |
---|---|
[2009/06/24] 시그널 핸들링과 좀비 프로세스 (0) | 2009.06.24 |
[2009/06/24] 프로세스 & 좀비 프로세스 (0) | 2009.06.24 |
[2009/06/23] 예제소스(fork.c) (2) | 2009.06.23 |