Linux下C语言进程通讯编程
代码:
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/shm.h>
- /*************基本的函数API********************
- 共享内存函数API
- int shmget(key_t key, int size, int flag)
- key:
- 共享内存的键值,多个进程可以通过它访问同一个共享内存。常用特殊值:IPC_PRIVATE,创建当前进程的私有共享内存
- size:
- 指定创建共享内存的大小
- flag:
- 操作权限
- char * shmat(int shm_id, const void * addr, int flag)
- shm_id:
- 要映射的共享内存标识符
- addr:
- 指定在调用进程中映射共享内存的地址。通常取值为0,表示由系统自动分配地址。
- flag:
- 设置共享内存的操作权限。若取值为0,表示可对共享内存进行读写操作。
- int shmctl(int shm_id, int cmd, struct shmid_ds * buf)
- shm_id:
- 共享内存标识符
- cmd:
- 指定索要进行的操作:IPC_STAT IPC_SET IPC_RMID SHM_LOCK SHM_UNLOCK
- buf:
- 结构体型指针
- int shmdt(const void * addr)
- **********************************************/
- #define Test_pipe 0
- #define Test_Shmget 0
- #define Test_AT_w 0
- #define Test_AT_r 0
- #define Test_DT 1
- int main(int argc, char *argv[])
- {
- #if Test_pipe
- int x,fd[];
- char buf[],s[];
- pipe(fd);
- x = fork();
- if( == x)
- {
- sprintf(buf,"This is an pipe!");
- write(fd[],buf,);
- exit();
- }
- else
- {
- wait();
- read(fd[],s,);
- printf("read: %s\n",s);
- }
- #endif
- #if Test_Shmget
- int shm_id;
- shm_id = shmget(IPC_PRIVATE,,);
- if(shm_id < )
- {
- perror("shmget id < 0");
- exit();
- }
- printf("成功建立共享内存区域: %d\n",shm_id);
- system("ipcs -m");
- #endif
- #if Test_AT_w
- int shm_id;
- char *shm_buf;
- shm_id = atoi(argv[]);
- shm_buf = shmat(shm_id,,);
- printf("写如数据到共享内存:\n");
- sprintf(shm_buf,"对共享内存的读写操作!");
- printf("%s\n",shm_buf);
- #endif
- #if Test_AT_r
- int shm_id;
- char *shm_buf,str;
- shm_id = atoi(argv[]);
- shm_buf = shmat(shm_id,,);
- printf("写如数据到共享内存:\n");
- sprintf(str,shm_buf);
- printf("%s\n",str);
- system("ipcs -m");
- #endif
- #if Test_DT
- int shm_id;
- char *shm_buf;
- shm_id = atoi(argv[]);
- shm_buf = shmat(shm_id,,);
- shmdt(shm_buf);
- shmctl(shm_id,IPC_RMID,NULL);
- system("ipcs -m");
- #endif
- }
IPC通讯中共享内存参看代码:
Client端代码client.c(gcc client.c -lm -o client)
shmget函数得到的共享内存的大小有参数确定,参数的单位是Byte!
同样的shmget参数的0666代表的内容是,共享内存空间的可读可写性!
使用ftok函数获取的key_t key的作用在于生成一个文件节点引索,这样才能够连接两个进程让他们以这个引索值作为标识ID!
shmdt函数用来删除释放掉创建的共享内存空间!
shmat函数用来映射已经创建好的虚拟内存空间地址!返回值为两个进程进行操作的共享内存起始地址!
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <time.h>
- #include <math.h>
- #define random(x) (rand()%x)
- #define PI 3.1415926
- #define Width 20
- #define Height 20
- int main(int argc,char *argv[])
- {
- key_t key = ;
- int shmid = ;
- setbuf(stdout,NULL);
- printf("Begin to Create the shared-mem...\n");
- key = ftok(".",); // Get the only IPC ID:inode'num + 1
- if(key<)
- {
- perror("ftok");
- return -;
- }
- printf("key=%d\n",key);
- sleep();
- printf("...\n");
- printf("%d\n",IPC_CREAT);
- shmid = shmget(key,,IPC_EXCL | IPC_CREAT | ); // Get shared mem:IPC_ID_key Mem_size
- if(shmid<)
- {
- perror("shmget");
- return -;
- }
- char * shared_mem_addr = shmat(shmid,NULL,); // mapping the mem_addr to the addr of the Process
- printf("...\n");
- sleep(); // waitting for setup the mem
- printf("The shared-mem create sucessfully!\n");
- printf("Begin to insert the data into shared-mem!\n");
- int i=;
- while(i<Width*Height)
- {
- *(shared_mem_addr+i) = *sin((double)i*PI/180.0);// random(255)+255;
- usleep();
- printf(".");
- i++;
- }
- printf("\nThe data insert finish!\n");
- shmdt(shared_mem_addr);
- return ;
- }
Server端代码server.c(gcc server.c -o server)
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <time.h>
- #define Width 20
- #define Height 20
- int main(int argc,char *argv[])
- {
- key_t key = ;
- int shmid = ;
- key = ftok(".",); // Get the only IPC ID:inode'num + 1
- if(key<)
- {
- perror("ftok");
- return -;
- }
- shmid = shmget(key,,IPC_CREAT | ); // Get shared mem:IPC_ID_key Mem_size
- if(shmid<)
- {
- perror("shmget");
- return -;
- }
- char * shared_mem_addr = shmat(shmid,NULL,); // mapping the mem_addr to the addr of the Process
- sleep();
- int i=;
- while(i<Width*Height)
- {
- printf("The image data:%d\n",*(shared_mem_addr+i));
- usleep();
- i++;
- }
- shmdt(shared_mem_addr);
- sleep();
- shmctl(shmid,IPC_RMID,NULL);
- return ;
- }
首先运行Clent端,然后再运行Server端即可!
参看IPC通讯介绍:https://www.cnblogs.com/CheeseZH/p/5264465.html
Linux下C语言进程通讯编程的更多相关文章
- linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到client的连接后,发送数据给client:clie ...
- linux下c语言的多线程编程
我们在写linux的服务的时候,经常会用到linux的多线程技术以提高程序性能 多线程的一些小知识: 一个应用程序可以启动若干个线程. 线程(Lightweight Process,LWP),是程序执 ...
- linux下C语言多线程编程实例
用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...
- Linux下C语言编程实现spwd函数
Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...
- Linux基础与Linux下C语言编程基础
Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...
- LINUX下C语言编程基础
实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...
- LINUX下C语言编程调用函数、链接头文件以及库文件
LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时, ...
- Linux下C语言编程基础学习记录
VIM的基本使用 LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...
- 【转】Linux基础与Linux下C语言编程基础
原文:https://www.cnblogs.com/huyufeng/p/4841232.html ------------------------------------------------- ...
随机推荐
- 弃 Java 而使用 Kotlin 的你后悔了吗?| kotlin将会是最好的开发语言
自从 2011 年发布以来,Kotlin 凭借强大的功能在开发者中的欢迎程度与日俱增.且在一年前,Google 宣布 Kotlin 正式成为 Android 官方开发语言,由此引发了从 Java 迁移 ...
- 10分钟了解Android的Handler机制
Handler机制是Android中相当经典的异步消息机制,在Android发展的历史长河中扮演着很重要的角色,无论是我们直接面对的应用层还是FrameWork层,使用的场景还是相当的多.分析源码一探 ...
- tensorflow中文教程
飞机票--->走你~~~ 飞机票 http://blog.csdn.net/lenbow/article/details/52152766
- 通过cmd 使用 InstallUtil.exe 命令 操作 windows服务 Windows Service
要安装windows service 首先要找到 InstallUtil.exe,InstallUtil.exe位置在 C:\Windows\Microsoft.NET\Framework\v4.0. ...
- Confluence 6 "net.sf.hibernate.PropertyValueException: not-null" 相关问题解决
如果你遇到了下面的错误信息,例如: ERROR [Importing data task] [confluence.importexport.impl.ReverseDatabinder] endEl ...
- Max Sum (dp)
Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. F ...
- Linux编程学习笔记(二)
续上个章节,这个章节主要是Linux的远程登录系统操作笔记 一. Linux一般作为服务器使用,但是服务器都是在机房的,所以不可能经常跑到机房去操作系统,所以使用远程登录系统,在Linux的系统一般使 ...
- bzoj 3566
非常好也是比较难的题 首先,不难看出这是一道树形的概率dp 那么我们就要考虑转移 我们发现,一个点能充上电的概率是这个点本身通电的概率+这个点的子节点给他传过来电的概率+这个点的父节点给他传过来电的概 ...
- (转)CSS3之pointer-events(屏蔽鼠标事件)属性说明
我们在 HTML 开发时可能会遇到这样的情况:页面上有一些元素使用绝对定位布局,这些元素可能会遮盖住它们位置下方的某个元素的部分或者全部.默认情况下,下方元素被遮挡的部分是不会响应鼠标事件的. 但有时 ...
- Python-数据类型之数字
一:数字类型概述 数字提供了标量存储和直接访问,属于不可变数据类型,所谓不可变,我们可以认为,更改数字的值会生成一个新的对象 # id可以唯一表示一个对象 age =18 print(id(age)) ...