学习 Linux高级编程08_A

来源:互联网 发布:r软件的使用 编辑:程序博客网 时间:2024/06/03 20:00

一、基于文件的通信

         1.普通文件(io/mmap)

         2.有名管道文件

         3.匿名管道文件

         4.Socket

二、基于内存的通信

         0.一组内核内存的工具

                   ipcs

                            ipcs-m

                            ipcs-q

                            ipcs-s

                   ipcrm

                            ipcrm-q编号ID

         1.普通的父子进程之间的匿名内存共享映射

         2.内核共享内存

                   编程模型

                   2.1创建共享内存,得到一个ID shmget

                   2.2ID映射称虚拟地址(挂载) shmat

                   2.3使用虚拟地址访问内核共享内存使用任何内存函数与运算符

                                     str***mem*** += ++ [] ->

                   2.4卸载虚拟地址 shmdt

                   2.5删除共享内存 shctl(修改/获取共享内存的属性)

         共享内存的属性

案例:

         A创建共享内存,并且修改内存数据

                   1.创建共享内存

                            intshmget(ke7_t key,  //key_tunsig int,为什么需要key

                                     intsize, //共享内存大小

                                     intflags)共享内存的属性与权限

                            为什么需要 key_t:

                                    约定创建与访问的是同一共享内存

                            第三个参数:

                                    方式|权限

                                    方式:

                                              创建 IPC_CREATIPC_EXCL(打开且保存以前数据)

                                              打开 0

                                    常见的两种方式

                                    创建:IPC_CREAT|IPC_EXCL| 0666

                            返回值:

                                    成功返回共享内存ID

                                    失败返回-1

         B根据ID得到共享内存,并且访问内存的数据。

                   voidshmat(int id,

                                     void*startaddr, //0:系统指定首地址

                                     intflags) //挂载方式,建议为0,可以为IPC_RONLY

         C.删除

                   intshmctl(int id, int how, struct shmid_ds)

                   how:

                            IPC_STAT

                            IPC_SET

                            IPC_RMID

         3.内核共享队列(有序)

                   编程模型:

                            3.1创建共享队列/得到消息队列  msgget

                            3.2使用队列(发送消息msgsnd/接收消息msgrcv)

                            3.3删除队列 msgctl

案例:

         A:创建一个共享队列

                   intmsgget(key_t, int);

         B:发送消息  

                   intmsgsnd(int id, //消息队列ID

                            constvoid *msg, //要发送消息

                            size_tlen, //消息的长度

                            intflags //发送消息的方式,建议为0

                   );

                   返回值:

                            -1:失败

                            0:成功

                   第二个参数的消息有固定的格式

                            4字节:表示消息的类型

                            若干字节:消息的内容。

                   第三个参数:

                            消息的大小,不包含类型的4个字节

三、基于socket文件的IPC

         socket文件的通信方式,比较重要,网络采用这种模型

         两种模型:

                   对等模型

                   C/S主客模型

         1.对等模型:

                   1.建立socketsocket

                                     intsocket(int domain, //地址族的类型 AF_UNIX FA_INET

                                     inttype, //支持的数据格式:流 SOCK_STREAM/报文 SOCK_DGRAM

                                     intprotocol); //支持的协议,建议为0. 0:默认协议

                            返回值:

                                    成功返回文件描述符。

                                    失败返回-1

                   2.绑定在地址上面(文件目录地址)URL(Universe Resource Location)

                            协议://路径/文件名

                            file:///usr/bin/ls

                            htpp://192.168.0.1/index.php

                            socketsockaddr;

                                     socketsocketaddr_un; //un=unix

                                     socketsocketaddr_in; //in=internet

                            bind()

                            intbind(int fd,  //socket描述符

                                               structsocketaddr *addr, //绑定地址

                                               socklen_tsize); //地址长度

                   3.接收数据

                            read/send/sendto

                   4.关闭socket

                  

                   1.建立socketsocket

                   2.连接到目标connect(可选)

                   3.发送数据write/send/sendto (write/send必须连接) sendto(可以不连接)

                   4.关闭 close

                  

                  

四、基于内存通信的应用:进程同步

         信号量