C指针原理 (25)-C指针基础

原创 2013年12月04日 19:37:17

结构与malloc

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

本博客所有内容是原创,如果转载请注明来源

http://blog.csdn.net/myhaspl/


首先,来看一个概念消息队列一个或多个进程可向消息队列写入消息,而一个或多个进程可从消息队列中读取消息,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 <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#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!\n");
       exit(1);
    }
    printf("message %d queue created!\n",queue_id);
    //创建发送消息结构
    printf("message send....\n");
    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\n");
       exit(1);
    }
    free(msg);//发送完毕,释放内存
    printf("message sended!\n");
    
   
    return 0;
}
 以上是发送消息,以下是接收消息
#define _GNU_SOURCE
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/types.h>
#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!\n");
       exit(1);
    }

    printf("message recv....\n");
    msg=(struct msgbuf*)malloc(sizeof(struct msgbuf)+100);
    rc=msgrcv(queue_id,msg,101,0,0);
    if (rc==-1){
       perror("recv error\n");
       exit(1);
    }
    printf("recv:%s\n",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$ 



版权声明:本文为博主原创文章,未经博主允许不得转载。http://blog.csdn.net/myhaspl

C语言的指针、链表的原理和各类操作

一、指针 1、运用指针         什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量。从指针指向的内存读取数据称作指针的取值。指针可以指向某些具体类型的变量地址...
  • BGD150809237
  • BGD150809237
  • 2016年05月13日 14:02
  • 2143

C语言指针教程----入门到精通<一>

有一个传说,指针是C语言的精髓;可同时,指针似乎也是C中很难理解的一部分。博主希望在自己复习的同时,写出一些学习心得和体会,供大家讨论。...
  • u014254779
  • u014254779
  • 2014年09月04日 12:39
  • 2363

c语言基本类型和指针

//导入标准函数库(类似于java的导包) #include //导入标准函数库(system、sizeof等等......) #include //windows系统的api #include ...
  • chuyouyinghe
  • chuyouyinghe
  • 2016年10月13日 10:37
  • 476

c语言指针使用小练习

#import void swap (int *a, int *b); void swap (int *a, int *b) { int temp; temp = *a;//通过改变...
  • quanzheng92
  • quanzheng92
  • 2014年07月26日 11:20
  • 2837

C语言学习篇-9指针运算、指针与数组

说明:本文主要阐述指针的基本运算及算术运算,指针与数组的关系,指针与字符串的关系。指针运算1.指针的基本运算包括取地址以及取值运算等运算。 单目运算符“&”是取操作对象的地址,“*”是取指针指向的对...
  • fd070910
  • fd070910
  • 2016年06月04日 23:08
  • 661

C指针原理(27)-汇编分析C指针机制

char*与char[]-从编译后的汇编代码分析 节 含义 .text 已编译程序的机器代码 .rodata 只读数据,如pintf和switch语句中的字符串和常量值 .dat...
  • u010255642
  • u010255642
  • 2013年12月06日 15:33
  • 1445

C/C++知识要点5——智能指针原理及自定义实现

智能指针概述: 智能指针用来管理动态对象。其行为类似于常规指针,重要的区别是:它负责自动释放所指向的对象。 C++ 11标准库提供两种智能指针:shared_ptr、unique_ptr 区别是...
  • TommyZht
  • TommyZht
  • 2015年08月10日 10:51
  • 1439

让你不再害怕指针——C指针详解(经典,非常详细)

前言:复杂类型说明     要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有...
  • soonfly
  • soonfly
  • 2016年04月12日 10:53
  • 53683

go语言指针与C指针的异同

总结一下golang中的指针与C语言的指针的用法。 总体一致:  C的代码:  ? 1 2 3 4 int*number; number = (int*) mall...
  • whatday
  • whatday
  • 2017年07月10日 17:13
  • 409

C语言:详解指针

指针应该算得上是c语言的精华,但也是难点。很多教程或者博客都有对其详细的讲解与分析。我这一节的内容,也是讲解指针,但我会尽量使用图解的方式,使大家很容易理解及掌握。 一、基本使用 先来看看下面的代码:...
  • sinat_27706697
  • sinat_27706697
  • 2015年08月22日 09:58
  • 20666
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C指针原理 (25)-C指针基础
举报原因:
原因补充:

(最多只允许输入30个字)