socketpair函数概要如下:
#include <sys/types.h> 定义一些C宏常量
#include <sys/socket.h> 定义socketpair函数原型
int socketpair(int domain, int type, int protocol, int sv[2]);

socketpair函数需要四个参数:
domain-套接口的域
type-套接口类型
protocol-使用的协议
sv[2]-指向存储文件描述符的指针

类型参数声明了我们希望创建哪种类型的套接口,socketpair函数的选择如下:
SOCK_STREAM
SOCK_DGRAM
对于socketpair函数,protocol参数必须提供为0。
参数sv[2]是接收代表两个套接口的整数数组。每一个文件描述符代表一个套接口,并且与另一个并没有区别。

如果函数成功,将会返回0值。否则将会返回-1表明创建失败,并且errno来表明特定的错误号。

socketpair可以用于多进程间全双工通讯。

1.调用socketpair,成功后便有两个socket文件描述符,一个socket就像是一个pipe。

在两个socket中指定一个给父进程使用,另外一个给子进程使用。不用在意指定哪一个socket给父进程使用,随便挑一个就可以了。

2.调用fork,成功后就创建了子进程

2.1 fork返回0,那就是子进程,关闭父进程的socket,保留子进程的socket

2.2 fork返回非0,那就是父进程,关闭子进程的socket,保留父进程的socket

为什么要关闭socket,现在还没有搞清楚。

3.现在有父子两个进程,每个进程都有一个socket描述符用以代表同一个pipe的两端。如果父进程调用write,那么子进程就调用read,反之亦然。

以下是一个代码示例片段:

void child(int socket) {const char hello[] = "hello parent, I am child";write(socket, hello, sizeof(hello)); /* NB. this includes nul *//* go forth and do childish things with this end of the pipe */
}void parent(int socket) {/* do parental things with this end, like reading the child's message */char buf[1024];int n = read(socket, buf, sizeof(buf));printf("parent received '%.*s'\n", n, buf);
}void socketfork() {int fd[2];static const int parentsocket = 0;static const int childsocket = 1;pid_t pid;/* 1. call socketpair ... */socketpair(PF_LOCAL, SOCK_STREAM, 0, fd);/* 2. call fork ... */pid = fork();if (pid == 0) { /* 2.1 if fork returned zero, you are the child */close(fd[parentsocket]); /* Close the parent file descriptor */child(fd[childsocket]);} else { /* 2.2 ... you are the parent */close(fd[childsocket]); /* Close the child file descriptor */parent(fd[parentsocket]);}exit(0); /* do everything in the parent and child functions */
}

Linux socketpair详解相关推荐

  1. Linux Socket详解 大全 基础知识

    1. Socket基础概念: 1.1:形象类比: Socket和电话网络的概念可以做一个很好的类比: Linux 编程中所说的socket就如同一个端点,类比到电话网中,它就如同一个电话机. 而Soc ...

  2. Linux系统调用详解(实现机制分析)

    为什么需要系统调用   linux内核中设置了一组用于实现系统功能的子程序,称为系统调用.系统调用和普通库函数调用非常相似,只是系统调用由操作系统核心提供,运行于内核态,而普通的函数调用由函数库或用户 ...

  3. 《Linux命令详解手册》——Linux畅销书作家又一力作

    关注IT,更要关心IT人,让系统管理员以及程序员工作得更加轻松和快乐.鉴于此, 图灵公司引进了国外知名出版社John Wiley and Sons出版的Fedora Linux Toolbox: 10 ...

  4. Linux系统详解 系统的启动、登录、注销与开关机

    Linux系统详解 第六篇:系统的启动.登录.注销与开关机 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://johncai.blo ...

  5. 每天一个linux命令(25):linux文件属性详解

    每天一个linux命令(25):linux文件属性详解 Linux 文件或目录的属性主要包括:文件或目录的节点.种类.权限模式.链接数量.所归属的用户和用户组.最近访问或修改的时间等内容.具体情况如下 ...

  6. c linux time微秒_学习linux,看这篇1.5w多字的linux命令详解(6小时讲明白Linux)

    用心分享,共同成长 没有什么比每天进步一点点更重要了 本篇文章主要讲解了一些linux常用命令,主要讲解模式是,命令介绍.命令参数格式.命令参数.命令常用参数示例.由于linux命令较多,我还特意选了 ...

  7. Linux系统结构 详解

    Linux系统结构 详解 标签: 产品产品设计googleapple互联网 2011-01-07 14:14 31038人阅读 评论(6) 收藏 举报 分类: Linux(21) 版权声明:本文为博主 ...

  8. 《嵌入式Linux软硬件开发详解——基于S5PV210处理器》——2.2 DDR2 SDRAM芯片

    本节书摘来自异步社区<嵌入式Linux软硬件开发详解--基于S5PV210处理器>一书中的第2章,第2.2节,作者 刘龙,更多章节内容可以访问云栖社区"异步社区"公众号 ...

  9. linux系统服务详解 用于Linux系统服务优化

    linux系统服务详解 用于Linux系统服务优化 服务名        必需(是/否)用途描述        注解 acon              否       语言支持        特别支 ...

最新文章

  1. 如何删除UITableView中的空单元格? [重复]
  2. Linux IPC udp/tcp/UNIX域 socket编程
  3. ShaderLab学习小结(十九)RenderToCubemap创建能反射周围环境的效果
  4. php 计算月,PHP自然月的算法
  5. linux数据同步技术比较,linux下实现web数据同步的四种方式(性能比较)教程.docx
  6. 《零基础》MySQL 数据类型(八)
  7. Java高级语法笔记-普通异常处理
  8. MVC学习二:基础语法
  9. Ubuntu Core for Raspberry Pi 使用笔记
  10. Python字符串串联
  11. 红黑树 c++ 实现
  12. windows 下 LITE IDE go lang 安装配置使用
  13. Tango学习笔记(1)
  14. 亚马逊云科技在中国市场火了?真相令人想不到
  15. 休闲一下---沙雕朋友圈的日常
  16. 【领导力】同理心:CIO 的力量倍增器
  17. Linux系统查看gcc,g++,java 等的版本
  18. 将文件指针复位C语言,C语言学习笔记之 文件操作
  19. μ1 - μ2的置信区间
  20. python 下三角矩阵_Python | 矩阵的上三角

热门文章

  1. Centos7 公钥登陆
  2. 微信小程序-商城完整实现
  3. 万年历首页效果android,简约好用的日历APP
  4. 150道大数据面试题
  5. STM32-按键检测
  6. Python的scrapy框架安装与使用
  7. ★Excel-VBA操作文件四大方法之一 by excelhome
  8. 4、TM4的系统时钟频率
  9. 楼主已经复活,博客恢复更新
  10. d2lSoftmaxpytorch