メッセージ待ち行列 msgsend msgrcv。 CでのSystem V IPCシステムコール(Linux)

c msgrcv msgsend shared-memory synchronization
メッセージ待ち行列 msgsend msgrcv。 CでのSystem V IPCシステムコール(Linux)

こんにちは私はさまざまなプロセスがデータを読み書きするいくつかの共有メモリを使用しています。 読み取りと書き込みの間でデータが変更されたときのメッセージを格納するためにメッセージキューを使用しています。

/* struct that defines a message */
struct msgbuf{
  long mtype;         /* must be positive */
  int childId;        //ID of child sending message
  int bufferChanged;  //Buffer at which value was changed
  int beforeValue;    //Value before child sleeps
  int afterValue;     //Value after child sleeps
};

そのため、読み取り、書き込み、および変更の確認中に、プロセスは次のようにメッセージを保存します。

struct msgbuf msg = {BUFFER_CHANGED, id, position, read, bufferArr[position]};
if(msgsnd(msqid, &msg, sizeof(msg), 0)== -1){
  perror("msgsnd in read.write");
}

これはうまくいっています。 ところで、ここでメッセージキューを作成する方法があります。

#define BUFFER_CHANGED 1

qKey = ftok("./", 'A');

msqid = msgget(qKey, (IPC_CREAT | 0666));

/*Perform the following if the call is unsuccessful.*/
if(msqid == -1){
  printf ("\nThe msgget call failed, error number = %d\n", errno);
}
/*Return the msqid upon successful completion.*/
else{
  printf ("\nMessage queue successful. The msqid = %d\n", msqid);
  //exit(0);
}

だから私の問題は、キューからメッセージを取り出して画面に表示する方法がよくわからないことです。 私は `msgrcv()`システムコールについて読み続けてきましたが、私にはそれほど明確ではありません。

rc = msgrcv(msqid, &msg, sizeof(msg), BUFFER_CHANGED, IPC_NOWAIT);

msgrcv()`は `int`を返すので、 rc`は `int`です。 この `int`を実際のメッセージに向けるにはどうすればいいですか? 表示できるようにメッセージから内容を読み取る方法を教えてください。 私はこれがある種のループで行われるべきだと思います。

  0  1


ベストアンサー

戻り値は int`です。メッセージバッファにどれだけのデータを読み込んだかを示しています - あなたの場合は 4 * sizeof(int) がメッセージ全体を返すのを見たいのです。 `rc`が-1として戻ってきたら、エラーがあります。 `rc`が正数として戻ってきた場合、 msg`の少なくともいくつかのフィールドは受信したメッセージデータを持ちます。

詳しくはhttp://linux.die.net/man/2/msgrcv [man page]をご覧ください。

0


rc = msgrcv(msqid, &msg, sizeof(msg), BUFFER_CHANGED, IPC_NOWAIT)

`msg`は画面に表示したいデータを含みます。 IPC_NOWAITが使用されているので、関数はブロックせずに直ちに戻ります。 msgが読み込まれなかった場合、rc値は-1になります。それ以外の場合、msgqから読み込まれたバイト数になります。

0


タイトルとURLをコピーしました