linux(八)
来源:互联网 发布:如何下载autocad软件 编辑:程序博客网 时间:2024/06/06 02:38
一.基于文件的通信 1.普通文件(io/mmap) 2.有名管道文件 3.匿名管道 4.Socket二.基于内存的通信 0.一组内核内存的工具 ipcs ipcs -m ipcs -q ipcs -s ipcrm -q 编号ID 1.普通的父子进程之间的匿名内存共享影射 2.内核共享内存 编程模型 2.1.创建共享内存,得到一个ID shmget 2.2.把ID影射成虚拟地址(挂载) shmat 2.3.使用虚拟地址访问内核共享内存 使用任何内存函数与运算符号 2.4.卸载虚拟地址 shmdt 2.5.删除共享内存 shctl(修改/获取共享内存的属性) 共享内存的属性 案例: A.创建共享内存,并且修改内存数据。 1.创建共享内存 int shmget(key_t key,//为什么需要key int size,//共享内存大小 int flags//共享内存的属性与权限 ) 为什么要key_t: 约定创建与访问的是同一个共享内存。 第三个参数: 方式|权限 方式:创建 IPC_CREAT IPC_EXCL 打开:0 常见的两种方式: 创建:IPC_CREAT|IPC_EXCL | 0666; 打开:0 返回: 成功返回共享内存ID 失败返回-1 B.根据ID得到共享,并且访问内存数据。 void shmat(int id, void *startaddr,//0:系统指定首地址 int flags)//挂载方式,建议0,可以使用IPC_RDONLY C.删除 int shmctl(int id,//被操作的共享内存ID int how,//操作方式:一共三种操作 struct shmid_ds*ds)//共享内存属性 how: IPC_STAT IPC_SET IPC_RMID 3.内核共享队列(有序) 编程模型: 3.1.创建共享队列/得到队列msgget 3.2.使用队列(发送消息msgsnd/接收消息msgrcv) 3.3.删除队列msgctl案例: A:创建共享队列 int msgget(key_t,int); B:发送消息 int msgsnd( int id,//消息队列ID const void *msg,//要发送消息 size_t len,//消息的长度 int flags//发送消息的方式,建议为0 ); 返回: -1:失败 0:成功 第二个参数的消息有固定的格式 4字节:表示消息的类型 若干字节:消息内容。 第三个参数: 消息的大小,不包含类型的4个字节三.基于socket文件的IPC socket文件的通信方式,比较重要,原因:网络采用这种通信模型。 两种模型: 对等模型 C/S模型 1.对等模型: 1.建立socket:socket int socket( int domain,//地址族的类型AF_UNIX AF_INET int type,//支持的数据格式:流SOCK_STREAM/报文SOCK_DGRAM int protocol);//支持的协议,建议为0 返回值: 成功返回文件描述符号。 失败返回-1; 2.绑定在地址上(文件目录地址)URL(Universe Resource Location) 协议://路径/文件名 file:///usr/bin/ls http://192.168.0.72/index.php struct sockaddr; struct sockaddr_un;un=unix struct sockaddr_in;in=internet int bind(int fd,//socket描述符号 struct sockaddr*addr,//绑定地址 socklen_t size);//地址长度 3.接收数据 read/recv/recvfrom 4.关闭socket 1.建立socket:socket 2.连接到目标:connect(可选) 3.发送数据:write/send/sendto 4.关闭close 2.C/S模型 Server Client 建立socket:socket 建立socket:socket 绑定地址:bind 建立连接:connect 监听:listen 接收:accept read/write read/write close close int listen(int fd,int num); 0:监听成功 -1:失败 int accept(int fd, struct sockaddr*addr,//返回连接着的地址 socklen_t* len)//接收返回地址的缓冲长度 返回: -1:接收失败 >=0:对应客户的文件描述符号 总结: 共享内存 共享队列 socket文件通信
0 0
- linux命令行 (八)
- linux(八)
- Linux Socket学习(八)
- Linux学习笔记(八)
- Linux Socket学习(八)
- Linux学习笔记(八)
- Linux学习笔记(八)
- Linux操作命令(八)
- Linux学习笔记(八)
- Linux每日学习(八)
- Linux内核分析(八)
- Linux学习日志(八)
- linux rsync介绍(八)
- linux学习笔记(八)
- Linux内核分析(八)
- linux(八)网络配置
- Linux基础操作(八)
- Linux系统基础(八)
- QObject 出现undefined vtable的解决方法
- Android-异步HttpClient框架(get/post)
- POJ 3648 Wedding(2-SAT 拓扑排序输出任意一种解决方案)
- 1084. Broken Keyboard (20)
- C Runtime Library 与 STL
- linux(八)
- hive学习笔记-表操作
- UVA 10870 Recurrences 矩阵乘法
- android adb常用指令
- [dfs]POJ3050 Hopscotch
- linux(九)
- android 开发 命名规范
- 何时使用条件变量? 我们有互斥锁不是就够了么?
- 关于OJ G++ 、C++提交