linux 消息队列简单入门

来源:互联网 发布:mac怎么安装搜狗 编辑:程序博客网 时间:2024/05/17 06:31

硬链接和软链接

硬链接类似指针,语法是:ln target linkname

你新建一个文件,然后ln a.c c.c 你修改其中任何一个文件都会体现出来。

都指到同一文件索引节点。

 

消息队列

新建魔数->新建队列->读写操作->ok。

对于消息队列的底层实现其实还是有点不明白,包括为什么可以再ftok里面的第二个参数中IPC_CREATE|0660 这样写,以及0660是如何计算出来的,在百度上基本没找到。如果那个博友知道烦请告知。

从代码来分析:

/*

 *queen.c

 *

 * Created on: 2014-12-9

 *     Author: Administrator

 */

 

 

#include<stdio.h>

#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/msg.h>

#include<stdlib.h>

#include<string.h>

#define M_TEXT 1024

typedef struct msg_buf

{

       long msgtype;

       char mtext[M_TEXT];

       }msgbuf;

int main(int argc,char * argv[])

{

                int key=0;

                int queen_id=0;

                int ret=0;

                key=ftok(".",97);

                printf("生成的魔數:%d",key);

                printf("開始創建消息隊列\n");

               queen_id=msgget(key,IPC_CREAT|0660);

                if(-1 == queen_id)

                {

                        printf("createmsg_queen failed");

                       perror("error:");

                        exit(-1);

                }

                printf("創建消息隊列成功:%d",queen_id);

                msgbuf msg;

                memset(&msg,0,sizeof(msg));

                msg.msgtype=0002;

                strcpy(msg.mtext,"i loveyou!!!!");

                printf("msg.txtlength:%d-%d=%d\n",sizeof(msg),sizeof(msg.msgtype),sizeof(msg)-sizeof(msg.msgtype));

                int i=0;

                while(i<10)

{                          

             ret=msgsnd(queen_id,&msg,sizeof(msg.mtext),0);

                if(-1==ret)

                {

                        printf("寫入失敗\n");

                       perror("error:");

 

                        ret=msgctl(queen_id,IPC_RMID,NULL);

                        exit(-1);

                }

                printf("寫入消息隊列成功\n");

                //sleep(300);

                i++;

                }

       //      ret=msgctl(queen_id,IPC_RMID,NULL);

                if(-1==ret)

{

printf("删除失败\n");

perror("error:");

}

return 0;

}

 

    key=ftok(".",97);

魔数,其实就是通过某种计算方式,获取到当天目录的文件索引号与97进行了某种运算,结果可以唯一的定位这个消息队列,如果相等的话,就可以算作我,你,他要找的是同一个消息队列,这也是为什么通过ftok就可以定位的唯一的消息队列的原因。

 

queen_id=msgget(key,IPC_CREAT|0660);

这是在获取或者说创建消息队列,IPC_CRATE如果存在就返回msgid,如果不存在就创建新的然后返回Msgid,后面还有一个IPC_EXCL如果存在消息队列的话,就会报错。至于权限控制位,在网上没有详细的说明,所以没办法在这里做过多的说明。

 

   msg.msgtype=0002;

这个是定义这个消息队列的一个消息的标示,如果你往消息队列里面写信息,你在读的时候这个是否匹配,决定了你是否能找到你刚才写进去的。如果在多进程的话,我想我可能会以这个进程的ID作为这个字段的值。

 

ret=msgsnd(queen_id,&msg,sizeof(msg.mtext),0);

第一个是msgget到的返回值,然后是默认结构体的地址,以及是否是阻塞还是非阻塞的选项。

 

基本上写的就是这样,其实还是满简单的。

我写了10次进去,所以有10条信息。

读:

/*reated on: 2014-12-9

 *     Author: Administrator

 */

 

 

#include<stdio.h>

#include<sys/types.h>

#include<sys/ipc.h>

#include<sys/msg.h>

#include<stdlib.h>

#include<string.h>

#define M_TEXT 1024

typedef struct msg_buf

{

       long msgtype;

       char mtext[M_TEXT];

       }msgbuf;

int main(int argc,char * argv[])

{

                int key=0;

                int queen_id=0;

                int ret=0;

                key=ftok(".",97);

        printf("生成的魔數:%d\n",key);

                printf("開始創建消息隊列\n");

               queen_id=msgget(key,IPC_CREAT|0660);

                if(-1 == queen_id)

                {

                        printf("createmsg_queen failed\n");

                       perror("error:\n");

//                      exit(-1);

                }

                printf("获取消息隊列成功:%d\n",queen_id);

                msgbuf msg;

                memset(&msg,0,sizeof(msg));

                msg.msgtype=0002;

       //      strcpy(msg.mtext,"ilove you!!!!");

                printf("msg.txtlength:%d-%d=%d",sizeof(msg),sizeof(msg.msgtype),sizeof(msg)-sizeof(msg.msgtype));

               ret=msgrcv(queen_id,&msg,sizeof(msg.mtext),0001,0);

                if(-1==ret)

                {

                        printf("读取失敗\n");

                       perror("error:");

                        exit(-1);

                }

                printf("读取的消息:%s\n",msg.mtext);

                printf("寫入消息隊列成功\n");

 

return 0;

}

 

 

问题:如果我在写的循环里面加了一个sleep函数,然后循环只会执行一次。不知道为什么?

0 0
原创粉丝点击