您的位置:首页 > 运维架构 > Linux

linux高级编程day08 笔记

2012-08-22 14:25 246 查看
一.基于文件的通信
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

View Code

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <linux/un.h>
#include <string.h>
#include <unistd.h>
main()
{
int fd;
int r;
char buf[100];
struct sockaddr_un addr={0};
//1.建立socket
//fd=socket(AF_UNIX,SOCK_DGRAM,0);
fd=socket(AF_UNIX,SOCK_STREAM,0);
//2.连接到指定的地址
addr.sun_family=AF_UNIX;
memcpy(addr.sun_path,"cs.sock",
strlen("cs.sock"));
r=connect(fd,(struct sockaddr*)&addr,
sizeof(addr));
//3.发送数据
while(1)
{
write(fd,"Hello!MaomaoYu!",
strlen("Hello!MaomaoYu!"));
read(fd,buf,100);
printf("%s\n",buf);
sleep(1);
}
//4.关闭
close(fd);
}


总结:
共享内存
共享队列
socket文件通信
课堂练习:
CS模型代码
CS模型把socket文件替换成IP地址

课后作业:
模仿课堂案例独立完成
1.共享内存
2.共享队列
3.socket对等模型
4.socket的CS模型
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: