本章介绍一种高级IPC---UNIX域套接字机制,并说明它的应用方法

UNIX域套接字

UNIX域套接字用于在同一台计算机上运行的进程(无关进程)之间的(全双工)通信。相比于因特网套接字,UNIX域套接字效率更高。

UNIX域套接字仅仅复制数据,不执行协议处理,不需要添加或删除网络报头,无需计算校验和,不要产生顺序号,无需发送确认报文。

UNIX域套接字提供流和数据报两种接口,就像是套接字和管道的混合(双向的通信),使用socketpair函数创建一对无命名的、相互连接的UNIX域套接字

#include <sys/socket.h>
int socketpair(int domain,int type,int protocol,int sockfd[]);

也可以使用它们面向网络的域套接字接口(socket)建立该套接字。

一对相互连接的UNIX域套接字可以起到全双工管道的作用:两端对读和写开放。

命名UNIX域套接字

上一章学习了然后将一个地址绑定到一个因特网域套接字上。跟因特网域套接字一样,可以命名UNIX域套接字,并可将其用于告示服务。

UNIX域套接字的地址由sockaddr_un结构表示,在Linux 3.2.0和Solaris 10中定义如下

struct sockaddr_un
{
    sa_family_t sun_family; /* AF_UNIX */
    char sun_path[UNIX_PATH_MAX]; /* pathname */
};

sun_path成员包含一个路径名。当我们将一个地址绑定到一个UNIX域套接字时,系统会用该路径名创建一个S_IFSOCK类型的文件。

该文件仅用于向用户进程告示套接字名字。该文件无法打开,也不能由应用程序用于通信。

下面程序是一个将地址绑定到UNIX域套接字的例子。

 #include "apue.h"
#include <sys/socket.h>
#include <sys/un.h> int
main(void)
{
int fd, size;
struct sockaddr_un un; un.sun_family = AF_UNIX;
strcpy(un.sun_path, "foo.socket");
if ((fd = socket(AF_UNIX, SOCK_STREAM, )) < )
err_sys("socket failed");
size = offsetof(struct sockaddr_un, sun_path) + strlen(un.sun_path);
if (bind(fd, (struct sockaddr *)&un, size) < )
err_sys("bind failed");
printf("UNIX domain socket bound\n");
exit();
}

下面是程序的运行情况

唯一连接

服务器进程可以使用标准的bind、listen和accept函数,为客户进程安排一个唯一UNIX域连接。

客户进程使用connect与服务器进程联系,在服务器进程接受了connect请求后,在服务器进程和客户进程之间就存在了唯一连接。

apue学习笔记(第十七章 高级进程间通信)的更多相关文章

  1. APUE读书笔记-第17章-高级进程间通信

    17.1 引言 *两种高级IPC:基于STREAMS的管道(STREAMS-based pipe)以及UNIX域套接字(UNIX domain socket)可以在进程间传送打开文件描述符.服务进程可 ...

  2. [汇编学习笔记][第十七章使用BIOS进行键盘输入和磁盘读写

    第十七章 使用BIOS进行键盘输入和磁盘读写 17.1 int 9 中断例程对键盘输入的处理 17.2 int 16 读取键盘缓存区 mov ah,0 int 16h 结果:(ah)=扫描码,(al) ...

  3. apue学习笔记(第一章UNIX基础知识)

    总所周知,UNIX环境高级编程是一本很经典的书,之前我粗略的看了一遍,感觉理解得不够深入. 听说写博客可以提高自己的水平,因此趁着这个机会我想把它重新看一遍,并把每一章的笔记写在博客里面. 我学习的时 ...

  4. APUE读书笔记-第14章-高级I/O

    14.1 引言 *高级I/O包括非阻塞I/O.记录锁.系统V流机制.I/O多路转换(select和poll函数).readv和writev函数以及存储映射I/O(mmap) 14.2 非阻塞I/O * ...

  5. apue学习笔记(第九章 进程关系)

    本章将详细地说明进程组以及POSIX.1引入的会话的概念.还将介绍登录shell和所有从登录shell启动的进程之间的关系 终端登录 BSD终端登录.系统管理者创建通常名为/etc/ttys的文件,其 ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第九章:贴图

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第九章:贴图 代码工程地址: https://github.com/j ...

  7. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...

  8. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  9. Stealth视频教程学习笔记(第二章)

    Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

随机推荐

  1. (转)iOS GPUImage研究总结

    目录(?)[-] Part one 关于GPUImage Part two 有关GPUImage的研究成果 Part Three 有关GPUImage的导入方式 Part Four 相关参考资料   ...

  2. JAVA使用JDBC连接MySQL数据库 一

    public class JDBCTest { public static void main(String[] args){ String driver = "com.mysql.jdbc ...

  3. BZOJ4650 [NOI2016]优秀的拆分 【后缀数组】

    题目 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 AA 和 BB 是任意非空字符串,则我们称该字符串的这种拆 分是优秀的.例如,对于字符串 aabaabaa,如果令 A=aabA=aa ...

  4. 座位安排(seat)

    座位安排(seat) 题目描述 费了一番口舌,wfj_2048终于成功地说服了n∗mn∗m个妹子来陪自己看电影. 为了这次声势浩大,wfj_2048包下了一座有n∗mn∗m个座位的电影院. (wfj_ ...

  5. modulus CRT

    (吐槽)额..CRT本来就是modulus的么.. CRT是可以每次加一个条件的(当然要保证coprime) 那么我们考虑 x=a (mod p1) x=b (mod p2) 这样的话我们知道 x=a ...

  6. [BZOJ]5018: [Snoi2017]英雄联盟 DP

    [Snoi2017]英雄联盟 Time Limit: 15 Sec  Memory Limit: 512 MBSubmit: 270  Solved: 139[Submit][Status][Disc ...

  7. jackson 的UnrecognizedPropertyException错误

    阅读更多 前段时间,使用jackson封装了json字符串转换为javabean的方法,代码如下: public static <T> T renderJson2Object(String ...

  8. js属性prototype的使用

    类似于一个构造化的类,使用prototype属性定义方法 <script> function Person(name) { this.name = name; alert(this.nam ...

  9. 【HDOJ5512】Pagodas(数论)

    题意:给定n,a,b,一开始集合里面有两个数:a和b,然后两个人轮流往这个集合里面增加数字 增加数字的原则是:这个集合里面任选两个数的和或差(a + b或a - b或b -a的中的任意一个没被选中的属 ...

  10. 【CF1043C】Smallest Word(构造)

    题意:给定一个由a和b构成的字符串,可以选择翻转或不翻转他的每个前缀,翻转记为1不翻转记为0,求能将字符串排序的字典序最小的操作序列 n<=1e3 思路:考虑极长的一段a [t,w] 翻转t-1 ...