메세지 큐에 대한 오류 질문입니다

ehddms10의 이미지

#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인데 올려도 되려나 문제 생기면 모르겠습니다;;

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.