자식 프로세스에서 부모 프로세스를 죽이는 방법이 있을까요?
멀티 채팅프로그램을 만들고 있습니다.
서버가 있고 여러개의 클라이언트들이 서버에 접속하여 1:1로 채팅을 할 수 있는 프로그램입니다.
접속한 클라이언트간 채팅방이 만들어져
1:1로 채팅을 시작하게 되면,
각각의 클라이언트는 fork를 통해 두 개의 프로세스로 나누어 집니다.
부모 프로세스는 사용자로부터 입력한 내용을 서버로 write하는 역할을,
자식 프로세서는 서버를 통하여 건너온 상대 클라이언트의 메세지를 read하여 화면에 출력하는 역할을 합니다.
여기서 제가 구현하고 싶은 기능은
두 클라이언트 중 어느 한명이라도 quit을 입력하면
둘 다 채팅방에서 나가게 되는 기능을 하고 싶은데요.
quit을 입력한 클라이언트 같은 경우,
부모 프로세스가 자식프로세스를 kill하면서 프로그램을 종료시킬 수가 있는데요.
상대 클라이언트의 경우, 자식이 상대방의 메세지를 확인하기 때문에 부모를 kill 할 수가 없는 상황입니다.
getppid() 함수를 이용하여 부모의 pid를 받아와
t=getppid();
kill(t, SIGQUIT);
하는 식으로 구현하였는데
부모는 죽지 않네요 절대로ㅜ
무림의 고수님들의 조언과 충고 부탁드리겠습니다. 꾸벅
아래는 저의 소스코드입니다.
====================================================================================
quit을 입력하면 정말로 끝낼건지 다시 한번 물어봅니다.
이때도 yes라고 대답하면, 서버에 #12071126#이라는 메세지를 전달합니다.
그리하여 상대 클라이언트는 서버로부터 #12071126#이라는 메세지를 전달받습니다.
====================================================================================
void talk(int x){
char buf[50];
int j,y;
j=fork();
if(j==0){
int t=getppid();
while(1){
y=read(x,buf,50);
buf[y]=0;
if( !strcmp(buf, "#12071126#") ){
printf("\n # The other gets out #\n");
break;
}else
printf("(%d)%s\n", t,buf);
}
kill(getppid(), SIGQUIT);
}else{
while(1){
gets(buf);
if(!strcmp(buf,"quit") || !strcmp(buf,"QUIT")){
printf(" # Really? (1=YES/2=NO) ");
scanf("%d", &y);
if(y==1){
write(x, "#12071126#", 10);
printf("\n");
break;
}
}
write(x, buf, strlen(buf));
}
kill(j, SIGQUIT);
}
}
자식이 죽는 경우 부모도 죽게 만드시면 될 듯
child: read "quit" -> exit
parent:
while(1)
{
read input ;
send input ;
if(waitpid(-1, NULL, WNOHANG) > 0) break ;
}
int main(int argc, char
댓글 달기