消息队列。 msgsend msgrcv。 System C IPC系统调用C(Linux)

时间:2009-11-05 05:05:39

标签: c synchronization shared-memory msgrcv msgsend

您好我正在使用一些共享内存,其中不同的进程读写数据。我正在使用消息队列来存储读取和写入操作之间数据发生变化的消息。

/* 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);

rcint,因为msgrcv()会返回int。如何将此int指向实际消息?如何从邮件中读取内容以便显示?我假设这应该在某种循环中完成。

2 个答案:

答案 0 :(得分:0)

返回值是int,因为它告诉您它在消息缓冲区中读取了多少数据 - 在您的情况下,您希望看到4 * sizeof(int)返回完整消息。如果rc返回-1,则表示您有错误。如果rc作为正数返回,则msg的至少部分字段将包含收到的消息数据。

查看man page了解详情。

答案 1 :(得分:0)

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

msg包含您要在屏幕上显示的数据。由于使用了IPC_NOWAIT,函数会立即返回而不会阻塞。如果没有读取msg,则rc值为-1,否则它将是从msgq读取的字节数。