7.2 에서 메시지큐 버그 ( ? )
글쓴이: alonecrow / 작성시간: 일, 2003/08/03 - 5:03오후
메시지큐를 이용해 프로그램을 하고 있는데
이상한 현상이 발생하네요.
메시지 큐에 데이터를 가져올때 큐에 저장된 데이타 보다 짧은 결과가 리턴됩니다.
아래 소스에서 처럼 큐에 Advanced Programming in the UNIX Environment 문자열을 넣고
꺼내게 되면 gramming int the UNIX Environment 로 앞에 부분이 잘려서 나옵니다.
레드헷 7.2에선 에러가 발생하는데 9.x버전에선 제대로 작동하는군요...
리눅스 버그인가요 ?
제 OS버전은 아래와 같구요
Linux version 2.4.9-e.24 (bhcompile@porky.devel.redhat.com) (gcc version 2.96 20000731 (Red Hat Linux 7.2 2.96-118.7.2))
#include <sys/stat.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <unistd.h> # include <sys/types.h> # include <sys/ipc.h> # include <sys/msg.h> #define LOG_MSG_SIZE 512 #define MESSAGE_KEY 1232 struct msgbuf { long msgtype; char mtext[LOG_MSG_SIZE]; }; char log_msg[LOG_MSG_SIZE]; void init_msg() { memset(log_msg, 0x00, LOG_MSG_SIZE); } int add_msg(char *msg) { if (strcat (log_msg, msg) == 0x00) return (-1); if (strcat (log_msg, ":") == 0x00) return (-1); // 항목 구분자. return (1); } key_t create_ipc() { key_t key_id; key_id = msgget((key_t)MESSAGE_KEY, 0666|IPC_CREAT); if (key_id == -1) { // write_log("create_ipc():msgget error\n"); return (-1); } return (key_id); } int put_ipc(key_t key_id) { struct msgbuf mybuf; if ((log_msg == 0x00) || (strlen(log_msg) <= 0)) return (-1); mybuf.msgtype = MESSAGE_KEY; memset(mybuf.mtext, 0x00, LOG_MSG_SIZE); memcpy(mybuf.mtext, log_msg, LOG_MSG_SIZE); printf("IPC MSG:%s\n", mybuf.mtext); printf("sizeof struct msgbuf:%d\n", sizeof(struct msgbuf)); if (msgsnd(key_id, (void *)&mybuf, sizeof(struct msgbuf), IPC_NOWAIT) == -1) { // write_log("put_ipc():msgsnd error\n"); return (-1); } return (1); } int get_ipc(key_t key_id, struct msgbuf *mybuf) { if (msgrcv(key_id, (void *)&mybuf, sizeof(struct msgbuf), MESSAGE_KEY, 0) == -1) { // write_log("get_ipc():msgrcv error\n"); return (-1); } return (1); } int main() { key_t key_id, key_id2; struct msgbuf mybuf; init_msg(); add_msg("Advanced Programming in the UNIX Environment"); key_id = create_ipc(); put_ipc(key_id); sleep(1); key_id2 = create_ipc(); get_ipc(key_id2, &mybuf); printf("key:[%ld]\nmsg:[%s]\n", mybuf.msgtype, mybuf.mtext); return (1); }
Forums:
Re: 7.2 에서 메시지큐 버그 ( ? )
포인터를 잘못 사용하셨습니다. 여기서 &mybuf는 인자값을
로컬 변수의 참조자로 해서 받았기 때문에 주소값의 주소값을
가르키게 되어 실제로 어떻게 작동할지 모르게 됩니다.
그리고 왜 void pointer로 casting 하시는지 모르겠습니다.
if (msgrcv(key_id, (void *)&mybuf, sizeof(struct msgbuf),
이부분에서
mybuf 라고 적어주시든지..
정 casting하고 싶으시면 (void *)mybuf 이렇게 하시면 잘 될 겁니다.
댓글 달기