socketpair创建双向通信的管道(全双工通信)
欢迎访问个站,你想要的,可能这里有
首页_码到城攻码到城攻分享但不限于IT技术经验技巧、软硬资源、所闻所见所领会等,站点提供移动阅读、文章搜索、在线留言、支付打赏、个人中心、免签支付等功能https://www.codecomeon.com/index
Linux下socketpair介绍:
socketpair创建了一对无名的套接字描述符(只能在AF_UNIX域中使用),描述符存储于一个二元数组,例如sv[2] .这对套接字可以进行双工通信,每一个描述符既可以读也可以写。这个在同一个进程中也可以进行通信,向sv[0]中写入,就可以从sv[1]中读取(只能从sv[1]中读取),也可以在sv[1]中写入,然后从sv[0]中读取;但是,若没有在0端写入,而从1端读取,则1端的读取操作会阻塞,即使在1端写入,也不能从1读取,仍然阻塞;
Linux实现了一个源自BSD的socketpair调用,可以实现在同一个文件描述符中进行读写的功能。该系统调用能创建一对已连接的UNIX族socket。在Linux中,完全可以把这一对socket当成pipe返回的文件描述符一样使用,唯一的区别就是这一对文件描述符中的任何一个都可读和可写,函数原型如下:
<span style="font-size:18px;">int socketpair(int d, int type, int protocol, int sv[2]);</span>
socketpair()函数建立一对匿名的已经连接的套接字,其特性由协议族d、类型type、协议protocol决定,建立的两个套接字描述符会放在sv[0]和sv[1]中。
第1个参数d,表示协议族,只能为AF_LOCAL或者AF_UNIX;
第2个参数type,表示类型,只能为0。
第3个参数protocol,表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STREAM建立的套接字对是管道流,与一般的管道相区别的是,套接字对建立的通道是双向的,即每一端都可以进行读写。参数sv,用于保存建立的套接字对。
/**进程双向通信*/
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>int main()
{int sv[2]; //一对无名的套接字描述符if(socketpair(PF_LOCAL,SOCK_STREAM,0,sv) < 0) //成功返回零 失败返回-1{perror("socketpair");return 0;}pid_t id = fork(); //fork出子进程if(id == 0) //孩子{//close(sv[0]); //在子进程中关闭读close(sv[1]); //在子进程中关闭读const char* msg = "我是孩子\n";char buf[1024];while(1){// write(sv[1],msg,strlen(msg));write(sv[0],msg,strlen(msg));sleep(1);//ssize_t _s = read(sv[1],buf,sizeof(buf)-1);ssize_t _s = read(sv[0],buf,sizeof(buf)-1);if(_s > 0){buf[_s] = '\0';printf("孩子说 : %s\n",buf);}}}else //父亲{//close(sv[1]);//关闭写端口close(sv[0]);//关闭写端口const char* msg = "我是父亲\n";char buf[1024];while(1){//ssize_t _s = read(sv[0],buf,sizeof(buf)-1);ssize_t _s = read(sv[1],buf,sizeof(buf)-1);if(_s > 0){buf[_s] = '\0';printf("父亲说 : %s\n",buf);sleep(1);}// write(sv[0],msg,strlen(msg));write(sv[1],msg,strlen(msg));}}return 0;
}
代码中有两行一样,一行被注释掉了,这正是说明博文第一段中的话:
“向sv[0]中写入,就可以从sv[1]中读取(只能从sv[1]中读取),也可以在sv[1]中写入,然后从sv[0]中读取”
整个流程就是,子进程写父进程读和父进程写子进程读同时在进行:上一张图看看:
截取一段代码,两个红色线的方向,都是从一个进程的写到另一个进程的读,同时进行,看运行结果:
打印时,成对打印,双向通信!
赐教!
socketpair创建双向通信的管道(全双工通信)相关推荐
- socketpair(双向通信)--高级IO
一.五种IO模型 1. 阻塞I/O (eg:钓鱼者(王一)只钓鱼,不和任何人说话,也不干任何其他的事) 2.非阻塞I/O (eg:钓鱼者(王二)一边钓鱼,一边问王一到底钓了多少鱼,但是王一并没有回答他 ...
- Linux-C语言-利用有名管道简单实现两个进程间的全双工通信
有名管道特点: 1.有名管道是对无名管道的改进,它可以使互不相关的两个进程互相通信,并且在文件系统中可见,可以通过文件名来找到. 2.半双工的通信方式,进程通过文件IO来操作有名管道. 3.有名管道遵 ...
- python socket双向通信_Python socket实现多对多全双工通信的方法
服务器:#server.py #!/usr/bin/env python #-*-coding:utf-8-*- import sys import struct#将字符串打包为二进制流进行网络传输 ...
- 客户端和服务器实现全双工通信(基于线程)
http://blog.sina.com.cn/s/blog_87766e4a0100yp7a.html 1. 基于多线程实现一个服务器和一个客户端实现全双工通信 服务器端创建两个线程:一个用于接收客 ...
- 单工通信、半双工通信、全双工通信 的概念
ps: 如果有任何问题可以评论留言,我看到后会及时解答,评论或关注,您的鼓励是我分享的最大动力 转载请注明出处:https://blog.csdn.net/qq_40938301/article/de ...
- 一文了解websocket全双工通信java实现socket地址404问题解决
websocket介绍 1.websocket介绍 1.1注解介绍 2.demo 2.1 后端代码 2.2 前端代码 2.3 效果 附录:socket地址404问题解决 1.websocket介绍 W ...
- USART串口全双工与SPI全双工通信的区别!
目录 1.背景知识 2.SPI的全双工同通信 3.串口USART的全双工通信 背景知识 首先我们先来区分一下单工.半双工.全双工模式. 单工:数据传输只支持数据在一个方向上传输 半双工:允许数据传输在 ...
- 本地对弈五子棋(以命名管道进行通信)
初步的界面如下: 为了实现不同的窗口.不同进程弈五子棋对弈,就需要在不同进程间的进行通信,我们采用linux底层的命名管道进行通信. 首先我们要进行管道通信头文件的包含.传输数据的结构定义.数据通信操 ...
- Spring MVC(11):通过 WebSocket 实现前后端全双工通信
Spring WebSocket 支持 通常应用程序之间交换信息会使用如 JMS.AMQP 等技术,但是它们都无法实现浏览器客户端和服务器之间的全双工通信,基于 HTML5 的 WebSocket 协 ...
最新文章
- swift string转int_Swift进阶二:基本数据类型相关
- Processing Orders With Windows Workflow
- SDCC 2015算法专场札记:知名互联网公司的算法实践
- Golang 之 Base62 编码
- 常见MOS管型号及参数对照表
- Context 之我见
- 一些很好的工具软件~
- cdr怎么转plt_win10系统怎么将cdr格式转换成plt?win10将cdr格式转换成plt的方法
- 第五代移动通信——5G
- 古诗词干货整理: 春、夏、秋、冬、山、水、日、月、风、花、雨、雪(简直太全了)
- 微信奇销36计 赖老师
- 程序员需要的日常(收费)软件(都免费)
- radius系列:freeradius测试
- 用安卓手机控制 HomeKit 智能设备?绿米Aqara设备接入智汀家庭云保姆级教程
- oracle ldom ipmp,在 Oracle VM Server for SPARC 虚拟网络中使用基于链路的 IPMP
- Hugo 博客搭建教程
- snakeyaml 简介、中文文档、中英对照文档 下载
- 数千名学者唾弃Nature的新付费访问机器学习期刊
- ubuntu 安装 LiveSuit 刷机工具
- VirtualBox Ubuntu20.04 网络设置
热门文章
- linux 邮件内容换行,linux----回车换行
- HTML+CSS中常见的几种居中方式
- 流程引擎课堂(二)| 基于开源流程引擎开发的BPM有那些难点?
- ZBrush建模很难么?那是没找到技巧!盘点八十个3DMAX常见的问题,小白珍藏系列
- 15.使用ref比reactive更好的几种场景
- Android开机自启动C程序调试
- 【转】USB--设备、配置、接口、端点
- stm32f1串口发送与接收
- 威速(v2), 大IT公司的销售经验, 软件代理机制, 代理协议 ...
- 算法:动态规划经典题目