C指针原理 (25)

浏览:
字体:
发布时间:2013-12-09 23:23:53
来源:

结构与malloc

结构是C语言中重要的一环,malloc是一个重要的函数,它完成了动态内存分配,用malloc分配的内存块要通过free释放。通过结构可以将不同类型的数据组合成一个整体,关于结构指针,LINUX下编程经常会运用一个技巧,这个技巧用在申请缓冲区上,可以申请不同大小的缓冲区。

 

 

首先,来看一个概念消息队列 ,一个或多个进程可向消息队列写入消息,而一个或多个进程可从消息队列中读取消息,Linux中的消息被描述成在内核地址空间的一个内部链表,每一个消息队列由一个IPC的标识号唯一的标识,Linux 为系统中所有的消息队列维护一个 msgque 链表,每个消息队列都在系统范围内对应唯一的键值,要获得一个消息队列的描述字,只需提供该消息队列的键值即可。

 

传递给队列的消息的数据类型是一个如下形式的结构,在Linux 的系统库linux/msg.h 中,它是这样定义的:

/* message buffer for msgsnd and msgrcv calls */

struct msgbuf {

long mtype; /* type of message */

char mtext[1]; /* message text */

};

其中,mtype成员代表消息类型,从消息队列中读取消息的一个重要依据就是消息的类型;mtext是消息内容。这个结构的精妙之处在于,mtext虽然在结构中被声明为大小为1的字符,但实际消息内容的长度可以由程序员任意定制,定制的关键在malloc函数。下面是部分代码段:

msg=(struct msgbuf*)malloc(sizeof(struct msgbuf)+100);//100为消息的长度,msgbuf结构只有2个成员一个成员是mytpe,另一个成员是一个字节的mtext,在结构后分配更多的空间以存放消息字符串

 

完整代码(演示了公共消息队列的使用)为:

 

#define _GNU_SOURCE#include #include #include #include #define QUE_ID 2//使用公共消息队列,读写进程可以不同时运行。int main(void){    int queue_id;    struct msgbuf *msg;    int rc;        //建立消息队列    queue_id=msgget(QUE_ID,IPC_CREAT|0600);//QUE_ID为一个正整数,公共消息队列的ID    if (queue_id==-1){       perror(create queue error!);       exit(1);    }    printf(message %d queue created!,queue_id);    //创建发送消息结构    printf(message send....);    msg=(struct msgbuf*)malloc(sizeof(struct msgbuf)+100);//100为消息的长度,msgbuf结构只有2个成员一个成员是mytpe,另一个成员是一个字节的mtext,在结构后分配更多的空间以存放消息字符串    msg->mtype=1;//消息类型,正整数    strcpy(msg->mtext,deepfuture.iteye.com);    //发送消息    rc=msgsnd(queue_id,msg,100,0);    //最后一个参数可以是是0与随后这些值(或者就是0):IPC_NOWAIT,如果消息类型没有则立即返回,函数调用失败    //MSG_EXCEPT,当消息类型大于0时,读与消息类型不同的第一条消息    //MSG_NOERROR,如果消息长度大于100字节则被截掉    if (rc==-1){       perror(msgsnd error);       exit(1);    }    free(msg);//发送完毕,释放内存    printf(message sended!);           return 0;}
以上是发送消息,以下是接收消息
#define _GNU_SOURCE#include #include #include #include #define QUE_ID 2//使用公共消息队列,读写进程可以不同时运行。int main(void){    int queue_id;    struct msgbuf *msg;    int rc;        //取得消息队列    queue_id=msgget(QUE_ID,0);//QUE_ID为一个正整数,公共消息队列的ID,    if (queue_id==-1){       perror(get queue error!);       exit(1);    }    printf(message recv....);    msg=(struct msgbuf*)malloc(sizeof(struct msgbuf)+100);    rc=msgrcv(queue_id,msg,101,0,0);    if (rc==-1){       perror(recv error);       exit(1);    }    printf(recv:%s,msg->mtext);          return 0;}


 

 

效果

 

deepfuture@deepfuture-laptop:~/private/mytest$ ./testmessnd

message 0 queue created!

message send....

message sended!

deepfuture@deepfuture-laptop:~/private/mytest$ ./testmesrecv

message recv....

recv:deepfuture.iteye.com

deepfuture@deepfuture-laptop:~/private/mytest$



>更多相关文章
24小时热门资讯
24小时回复排行
资讯 | QQ | 安全 | 编程 | 数据库 | 系统 | 网络 | 考试 | 站长 | 关于东联 | 安全雇佣 | 搞笑视频大全 | 微信学院 | 视频课程 |
关于我们 | 联系我们 | 广告服务 | 免责申明 | 作品发布 | 网站地图 | 官方微博 | 技术培训
Copyright © 2007 - 2024 Vm888.Com. All Rights Reserved
粤公网安备 44060402001498号 粤ICP备19097316号 请遵循相关法律法规
');})();