728x90
좀비 프로세스
- 프로세스는 main 함수가 반환되면 소멸되어야 함
- 그리고 return, exit를 통해 부모 프로세스로 결과 값이 반환이 됨
- 좀비 프로세스는 실행이 완료되었음에도 소멸이 되지 않는 프로세스를 말함
- 그렇기 때문에 프로세스의 리소스가 메모리 공간에 남아있음
- 좀비 프로세스가 생성되는 원인은 종료되면서 반환하는 상태 값이 부모 프로세스에 전달되지 않기 때문
int main(int argc, char *argv[])
{
pid_t pid=fork();
if(pid==0) // if Child Process
{
puts("Hi I'am a child process");
}
else
{
printf("Child Process ID: %d \n", pid);
sleep(30); // 자식 프로세스의 값을 받지 못하게 sleep
}
if(pid==0)
puts("End child process");
else
puts("End parent process");
return 0;
}
좀비 프로세스의 소멸
- wait 함수 : 자식 프로세스가 종료했을 때 OS에 올린 전달 값을 얻는 함수
-> wait 함수로 int 변수의 주소를 전달하면 반환과 관련된 정보가 저장됨
-> WIFEXITED : 자식 프로세스가 정상 종료됐는지 확인하는 매크로
-> WEITSTATE : 자식 프로세스의 전달 값을 반환
-> 만약 자식 프로세스가 종료되지 않은 상태에서 호출하면 block 상태가 됨
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
int status = 0;
pid_t pid=fork();
if(pid==0) // if Child Process
{
puts("Hi I'am a child process");
return 3;
}
else
{
printf("Child Process ID: %d \n", pid);
wait(&status);
if(WIFEXITED(status)) {
printf("child process's return value = %d\n", WEXITSTATUS(status) );
}
sleep(30); // 자식 프로세스의 값을 받지 못하게 sleep
}
if(pid==0)
puts("End child process");
else
puts("End parent process");
return 0;
}
- waitpid : 특정 자식 프로세스가 종료되었는지 확인하는 방법
-> 성공 시 종료된 자식 프로세스의 pid 또는 0을 실패 시 -1을 반환
-> pid : 확인하고자 하는 자식 프로세스의 pid를 전달. -1을 전달하면 임의의 자식 프로세스가 종료되길 대기
-> options : WNOHANG 상수를 전달하면 종료된 자식 프로세스가 존재하지 않아도 바로 0을 반환하면서 빠져나옴
-> 그렇기 때문에 wait와는 다르게 block 상태에 가지 않고 바로 확인이 가능
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int* statloc, int options);
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[])
{
int status;
pid_t pid=fork();
if(pid==0)
{
sleep(15);
return 24;
}
else
{
while(!waitpid(-1, &status, WNOHANG))
{
sleep(3);
puts("sleep 3sec.");
}
if(WIFEXITED(status)) {
printf("Child send %d \n", WEXITSTATUS(status));
}
}
return 0;
}
728x90
'Programming > Network' 카테고리의 다른 글
열혈 TCP/IP 10-4. 멀티태스킹 기반의 다중접속 서버 (0) | 2021.03.01 |
---|---|
열혈 TCP/IP 10-3. 시그널 핸들링 (0) | 2021.03.01 |
열혈 TCP/IP 10-1. 프로세스의 이해와 활용 (0) | 2021.03.01 |
열혈 TCP/IP 09-3. TCP_NODELAY (2) | 2021.02.24 |
열혈 TCP/IP 09-2. SO_REUSEADDR (0) | 2021.02.23 |