这章属于高级内容 内容比较简略

1.基于STREAMS的管道

流管道是一个双向(全双工)管道。单个流管道就能向父、子进程提供双向的数据流

1).命名的STREAMS管道

我们可以用fattach函数来在文件系统给一个STREAMS管道一个名字

#include <stropts.h>int fattach(int filedes, const char *path);
//成功返回0,错误返回-1。

path参数必须引用一个已有的文件,调用进程必须拥有这个文件,或有对它有写的权限,或使用超级用户特权运行。

一个进程可以调用fdetach来撤消STREAMS文件和文件系统里的名字之间的关联关系。

#include <stropts.h>int fdetach(const cha *path);
//成功返回0,错误返回-1。

在fdetach被调用后,任何通过打开path而有STREAMS管道的访问的进程将仍继续访问这个流,但是后续的path打开会访问在文件系统里的原始文件。

2).唯一连接

在将一个STREAMS管道连接到文件系统的一个名字之前,服务器进程可将connld模块推到要被附加的管道那端。这导致下图所示的配置。

2.Unix域套接字

UNIX域套接字被用来和同一机器上运行的进程通信。尽管因特网域套接字可以用作同样的目的,然而UNIX域套接字更高效。

可以使用面向网络的套接字接口来使用它们,或者你可以使用socketpair函数然创建一对没有名字的、连接的UNIX域套接字。

#include <sys/socket.h>int socketpair(int domain, int type, int protocol, int sockfd[2]);
//成功返回0,错误返回-1。

1).命名UNIX域套接字

2).唯一连接

3.传递文件描述符

下面三个函数可以发送和接收文件描述符

#include "apue.h"int send_fd(int fd, int fd_to_send);
int send_err(int fd, int status, const char *errmsg);
//成功返回0,错误返回-1。int recv_fd(int fd, ssize_t (*userfunc)(int, const void *, size_t));
//成功返回文件描述符,错误返回负值。

当一个进程(通常是服务器)希望将一个描述符传送给另一个进程时,它调用send_fd或send_err。等待接收描述符的进程(客户机)调用recv_fd。

send_fd经由fd代表的STREAM管道或UNIX域套接字发送描述符fd_to_send

send_err 经由用fd发送errmsg和status字节。status的值应在-1 ~-2 5 5之间

1).经由基于STREAMS的管道来传递文件描述符

文件描述符使用两个ioctl命令经由STREAMS管道交换,这两个命令是:I_SENDFD和I_RECVFD

2)经由UNIX域套接字来传递文件描述符

为了用UNIX域套接字交换文件描述符,我们调用sendmsg和recvmsg函数,涉及下面的函数和结构体(详见UNP)

下面三个宏被用来访问控制数据,一个宏用来帮助计算用于cmsg_len的值

#include <sys/socket.h>unsigned char *CMSG_DATA(struct cmsghdr *cp);
//返回和cmsghdr结构体相关的数据的指针。struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *mp);
//返回和msghdr结构体相关联的第一个cmsghdr结构体的指针,或者没有一个存在时返回NULL。struct cmsghdr *CMSG_NXTHDR(struct msghdr *mp, struct cmsghdr *cp);
//给定当前cmsghdr结构体,返回和msghdr结构体相关联的下一个cmsghdr结构体的指针,或我们已经在最后一个上时返回NULL

unsigned int CMSG_LEN(unsigned int nbytes);
//返回为nbytes大的数据对象分配的尺寸。

其中msghdr和cmsghdr结构体,这两个结构体对数据传送进行了控制

struct msghdr {void         *msg_name;              /* optional address */socklen_t    msg_namelen;            /* address size in bytes */struct       iovec  *msg_iov;        /* array of I/O buffers */int          msg_iovlen;             /* number of elements in array */void         *msg_control;           /* ancillary data */socklen_t    msg_controllen;         /* number of ancillary bytes */int          msg_flags;              /* flags for received message */};struct cmsghdr {socklen_t  cmsg_len;     /* data byte count, including header */int        cmsg_level;   /* originating protocol */int        cmsg_type;    /* protocol-specific type *//* followed by the actual control message data */
};

转载于:https://www.cnblogs.com/biyeymyhjob/archive/2012/08/04/2623403.html

Chapter 17 高级进程间通信相关推荐

  1. halcon算子盘点:Chapter 17:Tools

    Chapter 17:Tools 17.1 2D-Transformations 1. affine_trans_pixel  功能:对像素坐标轴进行任意的仿射二维变换. 2. affine_tran ...

  2. UNP Chapter 11 - 高级名字与地址转换

    11.1. 概述 函数gethostbyname和gethostbyaddr是依赖于协议的,使用前一个函数时,我们必须知道放置结果的套接口地址结构的成员是哪一种(举例来说,IPv4使用sin_addr ...

  3. Chapter 17 Causal Survival Analysis

    文章目录 17.1 Hazards and risks 17.2 From hazards to risks 17.3 Why censoring matters 17.4 IP weighting ...

  4. PYQT5(17)-高级界面控件-表格与树

    表格与树解决的问题是如何在一个控件中有规律地呈现更多的数据.PyQt提供了两种控件类用于解决该问题,其中一种是表格结构的控件类:另一种是树形结构的控件类. QTableView 以表格形式输出信息,可 ...

  5. 《地理信息系统导论》chapter 17 最小耗费路径分析和网络分析

    文章目录 习作6 寻找服务区 习作6 寻找服务区 输入2 5 (2空格5)作为2分和5分的默认断点

  6. MA Chapter 17 Budgetary process(SRCharlotte)

  7. 《UNIX环境高级编程(第3版)》

    <UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...

  8. 《UNIX环境高级编程中文版》pdf

    下载地址:网盘下载 内容简介 编辑 本书内容权威,概念清晰,阐述精辟,对于所有层次UNIX程序员都是一本不可或缺的参考书. 作品目录 编辑 第1章 UNIX基础知识 1 1.1 引言 1 1.2 UN ...

  9. 进程间通信-system-v

    文章目录 System V IPC概述 消息队列 创建或打开消息队列 消息控制 发送消息 接收消息 发送消息示例: 共享内存 创建共享内存 共享内存控制 共享内存映射和解除映射 共享内存使用示例: 信 ...

最新文章

  1. CNN模型之SqueezeNet
  2. sqlserver 自增ID插入指定数据
  3. 【OpenCV学习笔记4】OpenCV GUI 之VCWin32+OpenCV 实现细胞计数
  4. linux学习文档-1
  5. ionic入门教程第十六课-在微信中使用ionic的解决方案(按需加载加强版)
  6. c语言通讯录以及写入文件,学C三个月了,学了文件,用C语言写了个通讯录程序...
  7. 坑:pytest 运行报错unknown hook 'pytest_namespace' in plugin module 'allure.pytest_plugin'
  8. 开源网店系统_做仿货国外网店系统被谷歌禁掉该怎么办?
  9. 发布倒计时1天!华为Mate 30系列五大新功能曝光
  10. 20165205 2017-2018-2 《Java程序设计》实验三 敏捷开发与XP实践
  11. [转]Winform不规则窗体的实现心得
  12. 为什么C++静态static函数不能访问非静态成员
  13. 精通CSS:高级Web标准解决方案(中文电子书下载)
  14. Cookie 和 Session 规则
  15. 【软件设计师中级】设计模式之原型模式学习笔记(c++)
  16. Revel 企业级 Go 应用开发框架
  17. RNN(pytorch)的维度问题——用GRU实现文本分类(参考刘二大人)
  18. Usually, this means that the Expanded widget has the wrong ancestor RenderObjectWidget. Typically, E
  19. windows10应用商店打不开
  20. 含章节号的题注编号以阿拉伯数字显示

热门文章

  1. windows cmd color颜色设置
  2. 阻止应用继承的NTFS权限
  3. KITTI IMU 原始100Hz数据 (里面数据有重复)
  4. 北京驾照到期换证简记
  5. linux的运维管理UNIT3
  6. Struts2 原理
  7. Python的包管理工具Pip
  8. R in Action 读书笔记(5)
  9. 编程控制Word文档中Table的赋值
  10. debian---nano转VIM