메세지 큐에 대한 오류 질문입니다
글쓴이: ehddms10 / 작성시간: 토, 2022/10/15 - 5:30오후
#include"MyMsg.h" #include<signal.h> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<sys/ipc.h> #include<sys/msg.h> #include<sys/types.h> void signalHandler(int signum); int calculate(Calc calc); key_t mykey=0; int msqid=0; int main(int argc, char const *argv[]) { MsgCalc msgCalc; MsgRslt msgRslt; mykey=ftok("mymsgkey", 1); msqid = msgget(mykey, IPC_CREAT | 0600); signal(SIGINT, signalHandler); while(1) { puts("Wait"); memset(&msgCalc, 0x00, sizeof(MsgCalc)); msgrcv(msqid, &msgCalc, MSG_SIZE_CALC, MSG_TYPE_CALC, 0); printf("Receive: %d %c %d\n", msgCalc.calc.x, msgCalc.calc.op, msgCalc.calc.y); memset(&msgRslt, 0x00, sizeof(MsgRslt)); msgRslt.mtype=MSG_TYPE_RSLT; msgRslt.rslt=calculate(msgCalc.calc); msgsnd(msqid, &msgRslt, MSG_SIZE_RSLT, 0); printf("Send: %d\n", msgRslt.rslt); fflush(stdout); } return 0; } void signalHandler(int signum) { if(signum == SIGINT) { msgctl(msqid, IPC_RMID, NULL); exit(0); } } int calculate(Calc calc) { switch (calc.op){ case '+': return calc.x+calc.y; case '-': return calc.x-calc.y; case '*': return calc.x*calc.y; case '/': return (int)(calc.x/calc.y); default: return 0; } }
이건 서버이고
#include"MyMsg.h" #include<signal.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/ipc.h> #include<sys/msg.h> #include<sys/types.h> void signalHandler(int signum); int msqid = 0; int main(int argc, char const *argv[]) { key_t mykey = ftok("mymsgkey", 1);//key 생성 msqid = msgget(mykey, IPC_CREAT);//위에 생성한 key값으로 msg queue 생성 int x=0; int y=0; char op=0; MsgCalc msgCalc; MsgRslt msgRslt; signal(SIGINT, signalHandler); puts("input: [x] [op] [y]"); while(1) { printf("<<<"); scanf("%d %c %d", &x, &op, &y); fflush(stdout); fflush(stdin); memset(&msgCalc, 0x00, sizeof(MsgCalc)); msgCalc.mtype = MSG_TYPE_CALC; msgCalc.calc.x = x; msgCalc.calc.y = y; msgCalc.calc.op = op; // printf("%d %s %d", msgCalc.calc.x, msgCalc.calc.op, msgCalc.calc.y); fflush(stdout); msgsnd(msqid, &msgCalc, MSG_SIZE_CALC, 0);//서버에 전송 memset(&msgRslt, 0x00, sizeof(MsgRslt));//초기화 msgrcv(msqid, &msgRslt, MSG_SIZE_RSLT, MSG_TYPE_RSLT, 0); printf(">>> %d\n", msgRslt.rslt); } return 0; } void signalHandler(int signum) { if(signum==SIGINT) { msgctl(msqid, IPC_RMID, NULL); exit(0); } }
이건 클라이언트인데
우선 서버 실행 중 클라이언트를 끄면
Receive: 0 0
Send: 0
Wait
Receive: 0 0
Send: 0
Wait
Receive: 0 0
Send: 0
Wait
Receive: 0 0
Send: 0
Wait
Receive: 0 0
Send: 0
Wait
^CWait
이런게 계속 출력이 돼요 왜 이런건지 잘 모르겠는데 여기까지는 메세지 큐 보내는 쪽이 강제 종료가 되어서 그런갑다 하고 이해는 하겠는데 클라이언트에 sigHandler를 만들어 주기 전에는 다 종료하고 서버 다시 실행하면 아무것도 입력을 안했는데 똑같이 위에 값이 계속 출력이 돼요 클라이언트 쪽에 sigHandler 만들어 주니까 다 끄고 다시 실행하면 정상적으로 실행이 되었는데 뭐때문에 이런건지 잘 모르겠습니다 이거 대학 수업 ppt인데 올려도 되려나 문제 생기면 모르겠습니다;;
Forums:
댓글 달기