C指针原理 (25)
结构与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$
- 09-29如何通过wrap malloc定位C/C++程序的内存泄漏
- 02-25打车软件大战升级,补贴还能维持多久?
- 12-23BMP文件右旋90度[c语言]
- 12-23寻找直方图中面积最大的矩形(C语言版)
- 12-23[ndk,2]ndk开发案例和错误处理
- 12-23[ndk,1]ndk开发,C语言入门讲解
- 12-23C语言连续存储实现队列机制
- 12-23Objective-c 数据类型
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 12-05亚马逊推出新一代基础模型 任意模态生成大模
- 12-05OpenAI拓展欧洲业务 将在苏黎世设立办公室
- 12-05微软质疑美国联邦贸易委员会泄露信息 督促其
- 12-05联交所取消宝宝树上市地位 宝宝树:不会对公
- 12-04企业微信致歉:文档打开异常已完成修复