Linux上のSystem Vメッセージキューの期待どおりに動作しません。

StackOverflow https://stackoverflow.com/questions/390476

  •  23-08-2019
  •  | 
  •  

質問

私は、System Vメッセージキューを持つ大規模アプリケーションで抱えている問題を複製し、次のアプリケーションがあります。基本的には、主な機能は、キーを生成し、次いでmsggetのメッセージ・キューを作成します()。次いで、3本のフォークは、異なるIDを持つそれぞれを生み出しています。それらのそれぞれが異なるposative数(そう、彼らは異なるメッセージを待っている)とにmsgrcvを実行します。

メインは、IDにメッセージを送信し、数秒間スリープ= 3しかし、のではありませんの目を覚ます第三のスレッドではなく、1つ1つ異なります。あなたはそれを自分で試してみることができますので、このコードは完全に隔離されています。このコードで何が問題なのですか?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>

struct dummy_struct {
    long mtype;
    char message[255];
};

int msg_queue_id;
void recv_thread(int id);

int main(int argc, char **argv)
{
    int i;
    key_t key;
    struct dummy_struct dummy = { 3, "hello" };

    //create a unique key
    if (key = ftok("/mnt/mydocuments/code/sys_v_fork_test/main.c", 'a') == -1)
    {
        printf("ftok didn't work\n");
        exit(1);
    }

    //create the unix sys 5 message queue
    if ((msg_queue_id = msgget(key, 0644 | IPC_CREAT)) == -1)
    {
        printf("msgget failed\n");
        exit(1);
    }
    else
        printf("my message queue id: %i\n", msg_queue_id);

    //fork off multiple recievers
    for (i = 1; i < 4; i++) // <- NOTE: 1 -> 4
    {
        if (fork() == 0)
            recv_thread(i);
    }

    printf("sleeping\n");
    sleep(5);

    //wait a little then send a message

    printf("sending message\n");
    if (msgsnd(msg_queue_id, &dummy, sizeof(struct dummy_struct), 0) == -1)
    {
        printf("msgsnd failed\n");
    }
    printf("main thread exiting");
    _exit(0);
}

void recv_thread(int id)
{
    struct dummy_struct dummy;

    printf("recv_thread with id: %i\n", id);

    if (msgrcv(msg_queue_id, &dummy, sizeof(struct dummy_struct), id, 0) == -1)
        printf("error in msgrcv\n");
    else
        printf("thread %i got %s back\n", id, dummy.message);
}

私はその構造体に設定MTYPEが含まれているメッセージを意味する2を待つ場合は、の正確の2 3 3用など1。参照の私のポイントは、このガイドました:のhttp://www.ecst .csuchico.edu /〜beej / / IPC / mq.html に導きます。誰も助けてくださいことはできますか? (あなたが正常にテストするために、独自のマシン上の有効なファイルを指すようにコードのftok行を変更する必要があります)。私はのEeePC 1000H

上のFedora 10を実行していますよ
役に立ちましたか?

解決

ああ、私はそれを修正したと思います。私は「MTYPE」のための構造体に設定された第1のメンバーのために長いのではなく、int型を使用していたので、それはです。渡す{1L、「ハロー」}の代わりに、私の定義を変更するために長いそれを固定しているようだ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top