linux下编程进程通讯,Linux下C语言进程通讯编程

代码:

#include

#include

#include

/*************基本的函数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

#include

#include

#include

#include

#include

#include

#include

#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

{

*(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

#include

#include

#include

#include

#include

#include

#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

{

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端即可!

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

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

linux下c语言的多线程编程

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

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

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

随机推荐

scp 上传文件到多个服务器节点

参考:scp批量上传文件到多台机器上(升级版) 实测,代码可运行. 1.如果遇到syntax error near unexpected token问题,基本是由于windows环境下编写的shell ...

Oracle数据库sys为什么只能以sysdba登录

1.我们都知道,Oracle有两个具有dba角色的用户,分别是sys与system,他们都可以以sysdba身份登录数据库.既然system具有dba角色,为什么还分配他sysoper身份? [sys ...

MAC 平台 QT编写iphone程序,加载iphone模拟器失败解决办法

本日这么多年一直做C++开发,最近要做QT项目,被QT做界面的新特性所吸引.QSS QML的确是亮点. 还有一个就是跨平台这方面,自己玩了玩. 用的QT 的开发包是在官网上下载 qt-opensour ...

Python时间和日期学习

#coding=utf-8 __author__ = 'Administrator' #日期和时间模块学习 """ Python程序能用很多方式处理日期和时间,转换日期格 ...

移除IOS下按钮的原生样式

写WAP页面的时候  一定要加上这组样式,以避免在IOS下面按钮被系统原生样式影响 input,textarea {outline-style:none;-webkit-appearance:none ...

安装Java和Tomcat

安装Java 下载java源码包 安装的是JDK8,下载地址如下:下载链接 注意,不要在服务器中使用wget来下载jdk,因为oracle会认为你是爬虫,下载的文件不是jdk,而是一个html文件. ...

Go基础系列:channel入门

Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 channel基础 chann ...

备份与还原ORACLE数据库&lpar;通过CMD命令执行&rpar;

31.1:(若用程序调用cmd,则在备份和还原 末尾语句加上 2>&1 ,直接运行则不需要加) --备份:     1) exp SA/"""abc@123 ...

goim源码分析与二次开发-comet分析一

因为要完成一个聊天的项目,所以借鉴了goim,第一篇分析打算半原版,先摘抄http://www.jianshu.com/p/8bd96a9a473d他的一些理解,写这些还是为了让自己更好的理解这个项目 ...

discuz各个目录与文件的作用说明

discuz下面有很多文件夹以及文件,你们都知道他们是做什么的么?肯定不知道了吧.但是我们有经常遇到这些文件,譬如在后台文件校验操作都遇到某些文件被修改,这时候也需要知道这些文件是有什么作用的.今天就 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值