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
原创粉丝点击