|
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 です
|