SYNOPSIS(总览)

#include <sys/socket.h>
#include
<sys/un.h>

unix_socket = socket(PF_UNIX, type, 0);
error =
socketpair(PF_UNIX, type, 0, int *
sv);

DESCRIPTION(描述)

PF_UNIX (也称作 PF_LOCAL )
套接字族用来在同一机器上的提供有效的进程间通讯.Unix 套接字可以是匿名的(由 socketpair(2) 创建),
也可以与套接字类型文件相关联. Linux 还支持一种抽象名字空间, 它是独立于文件系统的.

有效的类型有: SOCK_STREAM 用于面向流的套接字, SOCK_DGRAM
用于面向数据报的套接字,其可以保存消息界限. Unix 套接字总是可靠的,而且不会重组数据报.

Unix 套接字支持把文件描述符或者进程的信用证明作为数据报的辅助数据传递给其它进程.

ADDRESS FORMAT(地址格式)

unix 地址定义为文件系统中的一个文件名或者抽象名字空间中的一个单独的字符串. 由
socketpair(2) 创建的套接字是匿名的.对于非匿名的套接字,目标地址可使用 connect(2) 设置.
本地地址可使用 bind(2) 设置. 当套接字连接上而且它没有一个本地地址时, 会自动在抽象名字空间中生成一个唯一的地址.

#define UNIX_PATH_MAX   108

struct sockaddr_un {
sa_family_t sun_family; /* AF_UNIX */
char sun_path[UNIX_PATH_MAX]; /* 路径名 */
};

sun_family 总是包含 AF_UNIX. sun_path 包含空零结尾的套接字在文件系统中的路径名. 如果 sun_path 以空零字节开头,它指向由 Unix 协议模块维护的抽象名字空间. 该套接字在此名字空间中的地址由 sun_path 中的剩余字节给定. 注意抽象名字空间的名字都不是空零终止的.

SOCKET OPTIONS(套接字选项)

由于历史原因, 这些套接字选项通过 SOL_SOCKET 类型确定, 即使它们是 PF_UNIX 指定的. 它们可以由 setsockopt(2) 设置. 通过指定 SOL_SOCKET 作为套接字族用 getsockopt(2) 来读取.

SO_PASSCRED 允许接收进程辅助信息发送的信用证明. 当设置了该选项且套接字尚未连接时, 则会自动生成一个抽象名字空间的唯一名字. 值为一个整数布尔标识.

ANCILLARY MESSAGES(辅助信息)

由于历史原因,这些辅助信息类型通过 SOL_SOCKET 类型确定, 即使它们是 PF_UNIX 指定的. 要发送它们, 可设置结构 cmsghdrcmsg_level 字段为 SOL_SOCKET, 并设置 cmsg_type 字段为其类型. 要获得更多信息, 请参看 cmsg(3).

SCM_RIGHTS
为其他进程发送或接收一套打开文件描述符. 其数据部分包含一个文件描述符的整型数组. 已传文件描述符的效果就如它们已由 dup(2) 创建过一样.

SCM_CREDENTIALS
发送或者接收 unix 信用证明. 可用作认证.信用证明传送以 struct ucred 辅助信息的形式传送.

struct ucred {
pid_t pid; /* 发送进程的进程标识 */
uid_t uid; /* 发送进程的用户标识 */
gid_t gid; /* 发送进程的组标识 */
};

发送者确定的信用证明由内核检查. 一个带有有效用户标识 0 的进程允许指定不与其自身值相匹配的值.发送者必须确定其自身的进程标识(除非它带有 CAP_SYS_ADMIN), 其用户标识,有效用户标识或者设置用户标识(除非它带有 CAP_SETUID), 以及其组标识,有效组标识或者设置组标识(除非它带有 CAP_SETGID). 为了接收一条 struct ucred 消息,必须在套接字上激活 SO_PASSCRED 选项.

VERSIONS(版本)

SCM_CREDENTIALS 和抽象名字空间是在 Linux 2.2 中引入的,不应该在要求可移植的程序中使用.

NOTES(注意)

在 Linux 实现中, 在文件系统中可见的套接字拥有它们所在目录的权限许可. 它们的所有者,组和权限可以作修改. 如果进程不拥有对创建的套接字所在目录的写和搜索(执行)权限, 则创建一个新的套接字会失败. 这种执行方式与许多由 BSD 发展而来的系统不同, 那些系统会忽略 Unix 套接字所需的权限. 可移植的程序不应把这项功能用于安全方面.

绑定文件名到套接字会在文件系统中创建一个套接字, 这个套接字在它不再需要时必须由调用者删除(使用 unlink(2)). 通用的 Unix 相关语义可适用; 套接字可在任何时候删除, 而且当最后一个引用关闭时, 最终会从文件系统中删除.

要传递文件描述符或者信用证明, 你需要发送/读取至少一个字节.

ERRORS(错误)

ENOMEM
内存溢出.

ECONNREFUSED
connect(2) 调用了一个未在监听的套接字对象. 这可能发生在远程套接字不存在或者文件名不是套接字的时候.

EINVAL
传递了无效参数. 通常的产生原因是已传地址的 sun_type 字段的 AF_UNIX 设置丢失, 或者套接字对应用的操作处于无效状态.

EOPNOTSUPP
在非面向流的套接字上调用了流操作,或者试图使用出界的数据选项.

EPROTONOSUPPORT
传递的协议是非 PF_UNIX 的.

ESOCKTNOSUPPORT
未知的套接字类型.

EPROTOTYPE
远程套接字与本地套接字类型不匹配 (SOCK_DGRAM 对 SOCK_STREAM).

EADDRINUSE
选择的本地地址已经占用,或者文件系统套接字对象已经存在.

EISCONN
在一个已经连接的套接字上调用 connect(2) 或者指定的目标地址在一个已连接的套接字上.

ENOTCONN
套接字操作需要一个目的地址,但是套接字尚未连接.

ECONNRESET
远程套接字意外关闭.
EPIPE
远程套接字在一个流套接字上关闭了.如果激活,会同时发送一个 SIGPIPE 标识.这可以通过传递 MSG_NOSIGNAL 标识给 sendmsg(2) 或者 recvmsg(2) 来避免.
EFAULT
用户内存地址无效.
EPERM
发送者在 struct ucred 中传递无效的信用证明.

当生成一个文件系统套接字对象时, 可能会由通用套接层或者文件系统产生其它错误. 要获得更多信息,可参见合适的手册页.

unix, PF_UNIX, AF_UNIX, PF_LOCAL, AF_LOCAL - 用于本地内部进程通讯的套接字。的更多相关文章

  1. 《Unix网络编程》卷一(简介TCP/IP、基础套接字编程)

    通常说函数返回某个错误值,实际上是函数返回值为-1,而全局变量errno被置为指定的常值(即称函数返回这个错误值). exit终止进程,Unix在一个进程终止时总是关闭该进程所有打开的描述符. TCP ...

  2. (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  3. Linux/UNIX套接字连接

    套接字连接 套接字是一种通信机子.凭借这样的机制.客户/server系统的开发工作既能够在本地单机上进行.也能够夸网络进行. 套接字的创建和使用与管道是有差别的.由于套接字明白地将客户和server区 ...

  4. Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字 . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级 ...

  5. 【UNIX网络编程(二)】基本TCP套接字编程函数

    基于TCP客户/server程序的套接字函数图例如以下: 运行网络I/O.一个进程必须做的第一件事就是调用socket函数.指定期望的通信协议类型. #include <sys/socket.h ...

  6. 【unix网络编程第三版】阅读笔记(三):基本套接字编程

    unp第三章主要介绍了基本套接字编程函数.主要有:socket(),bind(),connect(),accept(),listen()等. 本博文也直接进入正题,对这几个函数进行剖析和讲解. 1. ...

  7. unix网络编程——TCP套接字编程

    TCP客户端和服务端所需的基本套接字.服务器先启动,之后的某个时刻客户端启动并试图连接到服务器.之后客户端向服务器发送请求,服务器处理请求,并给客户端一个响应.该过程一直持续下去,直到客户端关闭,给服 ...

  8. Unix网络编程代码 第13章 守护进程和inetd超级服务器

    1. 概述 守护进程是在后台运行且不与任何控制终端关联的进程.unix系统通常有很多守护进程在后台运行,执行不同的管理任务.    守护进程没有控制终端通常源于它们由系统初始化脚本启动.然而守护进程也 ...

  9. UNIX环境高级编程 第16章 网络IPC:套接字

    上一章(15章)中介绍了UNIX系统所提供的多种经典进程间通信机制(IPC):管道PIPE.命名管道FIFO.消息队列Message Queue.信号量Semaphore.共享内存Shared Mem ...

随机推荐

  1. 自动化运维Shell入门

    运维shell 作用 项目部署 项目监控 什么是shell shell是一个程序,/bin/bash/,是一个命令解释器所有linux命令都由他来执行,打开终端就进入了 shell的交互式命令 运行方 ...

  2. java性能调优03

    1.java中的四种引用类型(级别由高到低为:强引用,软引用,弱引用和虚引用) 1.1 强引用:默认创建的变量都是强引用,垃圾回收机制不会将其回收,当内存空 间不足,Java虚拟机宁愿抛出OutOfM ...

  3. [轉]Reverse a singly linked list

    Reverse a singly linked list  http://angelonotes.blogspot.tw/2011/08/reverse-singly-linked-list.html ...

  4. qs.parse()、qs.stringify()使用方法, 以及在axios 中怎么用?

    最近一直被纠结于传输格式,就在这里整理一下吧. qs是一个npm仓库所管理的包,可通过npm install qs命令进行安装.   (axios 自带qs , // import qs from ' ...

  5. vue - blog开发学习3

    1.添加less 和less-loader支持 npm install less less-loader --save-dev 2.新建main.less,将这个样式添加到home.vue中的cont ...

  6. php常见的验证方法

    php常见的验证方法 干货文章 ·2018-03-16 23:50:36 <?php /** * @param $id * @return false|int * 检测id */ functio ...

  7. 小程序图片在安卓上拉伸的问题&导航&返回首页

      今天提了一个bug,有几张图片在安卓上面加载会先变大拉伸再恢复正常 出现这样的问题应该是用widthFix造成的 具体原因还不是很清楚,因为都是本地图片,所以我就直接把高也设置好就暂时没有这个问题 ...

  8. 我的黑苹果之路 9400f + msi b360 mortar + 1050ti

    硬件配置: CPU:i5 9400f 主板:微型msi迫击炮B360 内存:威刚 ddr4 8g 2133 *2 显卡:技嘉1050ti 4g 显示器:koiso 4K (使用的dp接口连接,hdmi ...

  9. 【leetcode】973. K Closest Points to Origin

    题目如下: We have a list of points on the plane.  Find the Kclosest points to the origin (0, 0). (Here, ...

  10. 【leetcode】961. N-Repeated Element in Size 2N Array

    题目如下: In a array A of size 2N, there are N+1 unique elements, and exactly one of these elements is r ...