쉘을 구현하고 있는데... ctrl c 구현하는데... 잘 안되는데 문제점좀 알려주세요ㅠ
쉘을 구현하고있습니다.. 현재 ctrl + c 가 되게 하려고 하고 있는데요
제가 개인적으로 공부한것에 의하면.. ctrl c 를 누르게되면 SIGINT 신호가 발생하고
signal(SIGINT,sigint_handler)와
signal(SIGCHLD,sigchld_handler)를 만들어노면
그럼 기본적으로 핸들러를 만들었으니까 ctrl c 를 누르게되면 핸들러를 호출하게되고 sigint 핸들러에서 프로세스를
종료시키고... 종료되면 다시 SIGCHLD가 발생해 부모프로세스에게 알려주는걸로 알고있거든요...
그래서 좀비프로세스를 막는다는.... 결론적으로 제가 알고싶으면.. ctrl c를 누르면 종료된 프로세스 아이디를 출력하고
어떠한 시그널에 의해 종료되었다는것을.. 확인하는건데
void sigint_handler(int sig){
Kill(getpid(),SIGINT);
return;
}
void sigchld_handler(int sig){
pid_t cpid;
int status;
if ( ( cpid =waitpid(-1,&status,WNOHANG|WUNTRACED )) > 0){
if(!(WIFSIGNALED(status)))
printf("(%d) %dcpid,WTERMSIG(status));
}
return;
}
이렇게 하면 해당하는 자식 프로세스 아이디를 얻어와 그 프로세스를 정지시키고 다시 SIGCHLD가 발생해
부모 프로세스에게 자식프로세스가 죽었다는 정보를 넘기고 waitpid 함수를 써서 정상적으로 종료되지않은 pid를 얻어와
그 pid 정보를 출력하는게 아닌가요... 계속..... 자식프로세스가.. 돌아간다는... 죽지않고.. ㅠㅠ
해결책좀 알려주시면 감사할께요 ㅠ
댓글 달기