代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/shm.h>
  4. /*************基本的函数API********************
  5. 共享内存函数API
  6. int shmget(key_t key, int size, int flag)
  7. key:
  8. 共享内存的键值,多个进程可以通过它访问同一个共享内存。常用特殊值:IPC_PRIVATE,创建当前进程的私有共享内存
  9. size:
  10. 指定创建共享内存的大小
  11. flag:
  12. 操作权限
  13. char * shmat(int shm_id, const void * addr, int flag)
  14. shm_id:
  15. 要映射的共享内存标识符
  16. addr:
  17. 指定在调用进程中映射共享内存的地址。通常取值为0,表示由系统自动分配地址。
  18. flag:
  19. 设置共享内存的操作权限。若取值为0,表示可对共享内存进行读写操作。
  20. int shmctl(int shm_id, int cmd, struct shmid_ds * buf)
  21. shm_id:
  22. 共享内存标识符
  23. cmd:
  24. 指定索要进行的操作:IPC_STAT IPC_SET IPC_RMID SHM_LOCK SHM_UNLOCK
  25. buf:
  26. 结构体型指针
  27. int shmdt(const void * addr)
  28. **********************************************/
  29. #define Test_pipe 0
  30. #define Test_Shmget 0
  31. #define Test_AT_w 0
  32. #define Test_AT_r 0
  33. #define Test_DT 1
  34. int main(int argc, char *argv[])
  35. {
  36. #if Test_pipe
  37. int x,fd[];
  38. char buf[],s[];
  39. pipe(fd);
  40. x = fork();
  41. if( == x)
  42. {
  43. sprintf(buf,"This is an pipe!");
  44. write(fd[],buf,);
  45. exit();
  46. }
  47. else
  48. {
  49. wait();
  50. read(fd[],s,);
  51. printf("read: %s\n",s);
  52. }
  53. #endif
  54.  
  55. #if Test_Shmget
  56. int shm_id;
  57. shm_id = shmget(IPC_PRIVATE,,);
  58. if(shm_id < )
  59. {
  60. perror("shmget id < 0");
  61. exit();
  62. }
  63. printf("成功建立共享内存区域: %d\n",shm_id);
  64. system("ipcs -m");
  65. #endif
  66.  
  67. #if Test_AT_w
  68. int shm_id;
  69. char *shm_buf;
  70. shm_id = atoi(argv[]);
  71. shm_buf = shmat(shm_id,,);
  72. printf("写如数据到共享内存:\n");
  73. sprintf(shm_buf,"对共享内存的读写操作!");
  74. printf("%s\n",shm_buf);
  75. #endif
  76.  
  77. #if Test_AT_r
  78. int shm_id;
  79. char *shm_buf,str;
  80. shm_id = atoi(argv[]);
  81. shm_buf = shmat(shm_id,,);
  82. printf("写如数据到共享内存:\n");
  83. sprintf(str,shm_buf);
  84. printf("%s\n",str);
  85. system("ipcs -m");
  86. #endif
  87.  
  88. #if Test_DT
  89. int shm_id;
  90. char *shm_buf;
  91. shm_id = atoi(argv[]);
  92. shm_buf = shmat(shm_id,,);
  93. shmdt(shm_buf);
  94. shmctl(shm_id,IPC_RMID,NULL);
  95. system("ipcs -m");
  96. #endif
  97. }

IPC通讯中共享内存参看代码:

Client端代码client.c(gcc client.c -lm -o client

shmget函数得到的共享内存的大小有参数确定,参数的单位是Byte!

同样的shmget参数的0666代表的内容是,共享内存空间的可读可写性!

使用ftok函数获取的key_t key的作用在于生成一个文件节点引索,这样才能够连接两个进程让他们以这个引索值作为标识ID!

shmdt函数用来删除释放掉创建的共享内存空间!

shmat函数用来映射已经创建好的虚拟内存空间地址!返回值为两个进程进行操作的共享内存起始地址!

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/ipc.h>
  6. #include <sys/shm.h>
  7. #include <time.h>
  8. #include <math.h>
  9.  
  10. #define random(x) (rand()%x)
  11. #define PI 3.1415926
  12.  
  13. #define Width 20
  14. #define Height 20
  15.  
  16. int main(int argc,char *argv[])
  17. {
  18. key_t key = ;
  19. int shmid = ;
  20. setbuf(stdout,NULL);
  21. printf("Begin to Create the shared-mem...\n");
  22. key = ftok(".",); // Get the only IPC ID:inode'num + 1
  23. if(key<)
  24. {
  25. perror("ftok");
  26. return -;
  27. }
  28. printf("key=%d\n",key);
  29. sleep();
  30. printf("...\n");
  31. printf("%d\n",IPC_CREAT);
  32. shmid = shmget(key,,IPC_EXCL | IPC_CREAT | ); // Get shared mem:IPC_ID_key Mem_size
  33. if(shmid<)
  34. {
  35. perror("shmget");
  36. return -;
  37. }
  38. char * shared_mem_addr = shmat(shmid,NULL,); // mapping the mem_addr to the addr of the Process
  39. printf("...\n");
  40.  
  41. sleep(); // waitting for setup the mem
  42.  
  43. printf("The shared-mem create sucessfully!\n");
  44. printf("Begin to insert the data into shared-mem!\n");
  45. int i=;
  46. while(i<Width*Height)
  47. {
  48. *(shared_mem_addr+i) = *sin((double)i*PI/180.0);// random(255)+255;
  49. usleep();
  50. printf(".");
  51. i++;
  52. }
  53. printf("\nThe data insert finish!\n");
  54. shmdt(shared_mem_addr);
  55. return ;
  56. }

Server端代码server.c(gcc server.c -o server

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/ipc.h>
  6. #include <sys/shm.h>
  7. #include <time.h>
  8.  
  9. #define Width 20
  10. #define Height 20
  11.  
  12. int main(int argc,char *argv[])
  13. {
  14. key_t key = ;
  15. int shmid = ;
  16. key = ftok(".",); // Get the only IPC ID:inode'num + 1
  17. if(key<)
  18. {
  19. perror("ftok");
  20. return -;
  21. }
  22. shmid = shmget(key,,IPC_CREAT | ); // Get shared mem:IPC_ID_key Mem_size
  23. if(shmid<)
  24. {
  25. perror("shmget");
  26. return -;
  27. }
  28. char * shared_mem_addr = shmat(shmid,NULL,); // mapping the mem_addr to the addr of the Process
  29.  
  30. sleep();
  31.  
  32. int i=;
  33. while(i<Width*Height)
  34. {
  35. printf("The image data:%d\n",*(shared_mem_addr+i));
  36. usleep();
  37. i++;
  38. }
  39. shmdt(shared_mem_addr);
  40. sleep();
  41. shmctl(shmid,IPC_RMID,NULL);
  42. return ;
  43. }

首先运行Clent端,然后再运行Server端即可!

参看IPC通讯介绍:https://www.cnblogs.com/CheeseZH/p/5264465.html

Linux下C语言进程通讯编程的更多相关文章

  1. linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到client的连接后,发送数据给client:clie ...

  2. linux下c语言的多线程编程

    我们在写linux的服务的时候,经常会用到linux的多线程技术以提高程序性能 多线程的一些小知识: 一个应用程序可以启动若干个线程. 线程(Lightweight Process,LWP),是程序执 ...

  3. linux下C语言多线程编程实例

    用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...

  4. Linux下C语言编程实现spwd函数

    Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...

  5. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  6. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  7. LINUX下C语言编程调用函数、链接头文件以及库文件

    LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时, ...

  8. Linux下C语言编程基础学习记录

    VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...

  9. 【转】Linux基础与Linux下C语言编程基础

    原文:https://www.cnblogs.com/huyufeng/p/4841232.html ------------------------------------------------- ...

随机推荐

  1. 深入Golang之sync.Pool详解

    我们通常用golang来构建高并发场景下的应用,但是由于golang内建的GC机制会影响应用的性能,为了减少GC,golang提供了对象重用的机制,也就是sync.Pool对象池. sync.Pool ...

  2. Confluence 6 禁用或者重新启用一个任务

    在默认的情况下,所有的 Confluence 计划任务都是默认启用的. 使用 启用(Disable )/ 禁用(Enable )连接操作来启用和禁用每一个计划任务. 不是所有的加护任务都可以被禁用的. ...

  3. shell中的ps命令详解

    ps简介:Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的 ...

  4. LeetCode(75):分类颜色

    Medium! 题目描述: 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 ...

  5. 【深度学习】吴恩达网易公开课练习(class1 week2)

    知识点汇总 作业内容:用logistic回归对猫进行分类 numpy知识点: 查看矩阵维度: x.shape 初始化0矩阵: np.zeros((dim1, dim2)) 去掉矩阵中大小是1的维度: ...

  6. echarts + timeline 显示多个options

    var option = { //timeline基本配置都写在baseoption 中 baseOption: { timeline: { //loop: false, axisType: 'cat ...

  7. 反序列化json的坑

    json格式没有错误,内容没有什么异常 反序列化一直显示第一行有异常符号, 在https://jsonlint.com/上面检测了一下,发现了这个 解决办法: UTF-8格式编码 改成 UTF-8无B ...

  8. 手机app数据的爬取之mitmproxy安装教程

    mitmproxy是一个支持HTTP和HTTPS的抓包程序,类似Fiddler.Charles的功能,只不过它通过控制台的形式操作. 此外,mitmproxy还有两个关联组件,一个是mitmdump, ...

  9. openstack 网络更改版

    Openstack环境部署 (参考文献:http://www.cnblogs.com/kevingrace/p/5707003.html 和 https://docs.openstack.org/mi ...

  10. python字符串之split

    函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(lis ...