当前位置:  技术问答>linux和unix

IPC message queue

    来源: 互联网  发布时间:2017-05-18

    本文导语:  先上代码,我再提出问题: 先是进程 1,queue_w.c (向创建的message queue里面写入消息) 然后是进程2,queue_r.c (向进程1创建的message queue 里面读出消息) 1: #include  #include  #include  #include  #include  #include  #define B...

先上代码,我再提出问题:
先是进程 1,queue_w.c (向创建的message queue里面写入消息)
然后是进程2,queue_r.c (向进程1创建的message queue 里面读出消息)
1:

#include 
#include 
#include 
#include 
#include 
#include 
#define BUF_SIZE 256

struct message{
long int mytype;
char buf[BUF_SIZE];
};

int main(void)
{
key_t key;
/*生成一个键值*/
if((key=ftok("/home/leilei/project/lei",1))==-1)
{
perror("ftok errorn");
exit(-1);
}
printf("key=%dn",key);/*测试key_t是否被封装成int,以%d格式打印,格式不匹配的话会自动警告*/
/*用key产生一个message queue*/
int num0=msgget(key,0666|IPC_CREAT|IPC_EXCL);/*如果key已经存在,会报错(如果加了IPC_EXCL),也可以把第一个参数用宏IPC_PRIVATE*/
if(num0==-1)
{
perror("msget errorn");
exit(-1);
}
/*成功调用msgget函数获得的一个标示符,非负数(a nonnegative integer)*/
printf("msget success,num0=%dn",num0);/*message queue 标示符*/

/*向message queue 发送消息*/
/*struct mymsg mg={1,"hello,world"};//这个自己随便定义比如指定0为传输的文本文件,那么下次传输其他文件时候就不能指定为0*/
/* 后记,经过测试加察看man手册,这个 long int 类型的mytype不能为0,只能大于0*/

struct message mg;
mg.mytype=1;
strcpy(mg.buf,"hello,world"); 
if( (msgsnd(num0,(const void *)&mg,BUF_SIZE,0))==-1 )
{
perror("msgsnd errorn");
exit(-1);
}



return 0;
}



2:

#include 
#include 
#include 
#include 
#include 
#include 
#define BUF_SIZE 256
struct message{
long int mytype;
char buf[BUF_SIZE];
};
int main(void)
{
key_t key;
if((key=ftok("/home/leilei/project/lei",1))==-1)
{
perror("ftok errorn");
exit(-1);
}
int num0=msgget(key,0666|IPC_CREAT);/*打开消息队列*/
if(num0==-1)
{
perror("msgget errorn");
exit(-1);
}
printf("msgget success,num0=%dn",num0);/* 消息队列标示符*/
/*从消息队列里接受消息*/
struct message mg;
mg.mytype=1;
ssize_t num1=msgrcv( num0,(void *)&mg,BUF_SIZE,mg.mytype,0);
if(num1==-1)
{
perror("msgrcv errorn");
exit(-1);
}
printf("msgrcv success:");
printf("%sn",mg.buf);
/*删除消息队列*/
if( (msgctl(num0,IPC_RMID,NULL))==-1)
{
perror("msgctl errorn");
exit(-1);
}
return 0;
}


然后来一张结果的截图,令人信服;
IPC message queue [图片]


现在我提出问题:
进程1中,我有一个位置不太明白,虽然man手册里面是这样规定
The msgp argument is a pointer to caller-defined structure of the  following general form:
 

     struct msgbuf {
               long mtype;       /* message type, must be > 0 */
               char mtext[1];    /* message data */
           };

我的进程中是这样定义的 

struct message{
long int mytype;/* message type, must be > 0 */   /*我主要就是想了解这个地方为什么不能为0*/
char buf[BUF_SIZE]; /* message data */

};

然后下面我定义了一个结构体变量
struct message mg;
问题来了:
mg.mytype=1;//之前我没有认真看手册,是写的0,
结果会报错 (Invalid argument)
也就是参数用的不合理
于是我想了很久,为什么这个不能为0.
谢谢!

|
消息类型必须大于0,因为对于 msgrcv 函数来说,非正的消息类型用作特殊的指示:
如果 type 为 0,那就返回该队列中的第一个消息;
如果 type 大于 0,返回类型为 type 的第一个消息;
如果 type 小于 0,返回类型值小于或等于 type 的绝对值的消息中类型值最小的第一个消息。

见 《UNIX 网络编程 卷2:进程间通信》


|
 The system call msgrcv reads a message from the message queue specified by msqid into the msgbuf pointed to by the msgp argument, removing the read message from the queue.

 ssize_t msgrcv(int msqid, struct msgbuf *msgp, size_t msgsz, long msgtyp, int msgflg);   

The argument msgtyp specifies the type of message requested as follows:

    If msgtyp is 0, then the first message in the queue is read. 
    If msgtyp is greater than 0, then the first message on the queue of type msgtyp is read, unless MSG_EXCEPT was asserted in msgflg, in which case the first message on the queue of type not equal to msgtyp will be read. 
    If msgtyp is less than 0, then the first message on the queue with the lowest type less than or equal to the absolute value of msgtyp will be read. 

|
上面两位说的很好,type有一种理解为应用程序对消息的优先权

|
应该是消息队列的内部实现原因吧 
具体代码我也没看  瞎猜。

|
不太清楚哎,可能是这个号,有特定的含义

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教:sun中程序执行semid = semget( IPC_PRIVATE, 1, 0600 | IPC_CREAT ),semid < 0,是什么原因?
  • 关于l inux ipc 冲突
  • 求助关于posix ipc 对象创建相关问题
  • 如何使Linux内核支持System V IPC?
  • UNIX系统下的IPC机制
  • shmdt(addr) 和 shmctl(shmid,IPC_RAID,0)有什么区别?
  • Linux IPC 问题
  • LINUX中实现单实例功能使用哪种IPC好啊?
  • ACE与网络IPC的关系是什么?
  • 关于IPC的简单问题
  • 使用ipcrm清理ipc
  • IPC的权限问题
  • 到底还要不要学习System V IPC?
  • 一道ipc的题目
  • ipc里面常用的"管道"和"消息队列"本质上有什么不同?
  • cygwin下ipc共享内存
  • 宏内核系统IPC使用的传递机制是什么
  • android IPC之binder通信机制
  • IPC_CREAT | 0660 的意义是什么?
  • FreeBSD 不支持 POSIX IPC?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,