【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19388

IPCプロセス間通信
投稿者---ipc(2005/01/22 19:27:35)


IPCプロセス間通信

現在IPCプロセス間通信の動作確認をしています。
質問内容はmsgget関数の第1引数にIPC_PRIVATEを指定した場合の
動作イメージがつかめないことです。
------------------------------------------------------
以下のようにmsgget関数の第1引数にキーを指定した場合は
動作確認しました→プロセスBでメッセージ受信
(エラー処理の記述は省略してあります)

プロセスA(送信プロセス)
1 msgget関数にキー(1000)とIPC_CREAT指定して、
 メッセージキューIDを作成
2 msgsnd関数にてメッセージを送信

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

void main(void)
{
    struct msgbuf{
        long int type;
        char data[BUFSIZ];
    };
    struct msgbuf message;

    message.type=1;
    strncpy(message.data,"TEST",5);

    int msqid;
    msqid = msgget((key_t)1000, 0666 | IPC_CREAT);
    msgsnd(msqid, &message, BUFSIZ, 0);
}

プロセスB(受信、削除プロセス)
1 msgget関数にキー(1000)とIPC_CREAT指定してメッセージキューIDを取得
2 msgrcv関数にてメッセージを受信
3 msgcnt関数にてメッセージキューを削除

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

void main(void)
{
    struct msgbuf{
        long int type;
        char data[BUFSIZ];
    };
    struct msgbuf message;

    long int type=1;

    int msqid;
    msqid = msgget((key_t)1000, 0666 | IPC_CREAT);
    msgrcv(msqid, &message, BUFSIZ, read_type, IPC_NOWAIT);
    msgctl(msqid, IPC_RMID, 0);
}
----------------------------------------------------------
msgget関数の第1引数にIPC_PRIVATEを指定すると

プロセスAA(送信プロセス)
1 msgget関数にIPC_PRIVATEとIPC_CREAT指定して、
 メッセージキューIDを作成
  (他のプロセスからはmsgget関数からはこのキューを取得できない)
2 msgsnd関数にてメッセージを送信

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

void main(void)
{
    struct msgbuf{
        long int type;
        char data[BUFSIZ];
    };
    struct msgbuf message;

    message.type=1;
    strncpy(message.data,"TEST",5);

    int msqid;
    msqid = msgget(IPC_PRIVATE, 0666 | IPC_CREAT);
    msgsnd(msqid, &message, BUFSIZ, 0);
}

プロセスBB(受信、削除プロセス)
1 msgget関数にキー(1000)とIPC_CREAT指定して
 メッセージキューIDを取得
2 msgrcv関数にてメッセージを受信
3 msgcnt関数にてメッセージキューを削除

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

void main(void)
{
    struct msgbuf{
        long int type;
        char data[BUFSIZ];
    };
    struct msgbuf message;

    long int type=1;

    int msqid;
/********取得できないのでコメントアウト********************/
    msqid = msgget((key_t)1000, 0666 | IPC_CREAT);
/******************************************************/
    msgrcv(4444444, &message, BUFSIZ, read_type, IPC_NOWAIT);
    msgctl(4444444, IPC_RMID, 0);
    /*プロセスAで取得したメッセージキューIDを直接書き込み */
}


--------------------------------------------------------
私の調べた結果として、IPC_PRIVATEを指定すると
即新しいメッセージキューIDを探しメッセージキューを作成する
という結論が出ました。(キューIDを複数作成)
つまり、プロセスAAは複数連続で実行できると考えています。
しかし、メッセージキューは作成できましたが
メッセージが送れないのです。。。

エラーNo13  Permission denied
が出ます。

どなたか実行エラーが出る理由と
IPC_PRIVATEを指定した場合の流れをご教授お願いします。

OSは HP-UX です




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧