7.2 에서 메시지큐 버그 ( ? )

alonecrow의 이미지

메시지큐를 이용해 프로그램을 하고 있는데
이상한 현상이 발생하네요.

메시지 큐에 데이터를 가져올때 큐에 저장된 데이타 보다 짧은 결과가 리턴됩니다.
아래 소스에서 처럼 큐에 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);
}
errai의 이미지

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);
}

포인터를 잘못 사용하셨습니다. 여기서 &mybuf는 인자값을
로컬 변수의 참조자로 해서 받았기 때문에 주소값의 주소값을
가르키게 되어 실제로 어떻게 작동할지 모르게 됩니다.
그리고 왜 void pointer로 casting 하시는지 모르겠습니다.

if (msgrcv(key_id, (void *)&mybuf, sizeof(struct msgbuf),
이부분에서

mybuf 라고 적어주시든지..
정 casting하고 싶으시면 (void *)mybuf 이렇게 하시면 잘 될 겁니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.