《UNP》随笔——socketpair和pipe的区别
文章目录
- 1. socket函数
- 1.1读写位于同一进程
- 1.2 读写位于不同的进程
- 2. pipe函数
- 3. 区别
1. socket函数
socketpair()函数的声明:
#include <sys/types.h>
#include <sys/socket.h>
int socketpair(int d, int type, int protocol, int sv[2]);
socketpair()函数用于创建一对无名的、相互连接的套接子。
如果函数成功,则返回0,创建好的套接字分别是sv[0]和sv[1];否则返回-1,错误码保存于errno中。
基本用法:
- 这对套接起sv[2]可以用于全双工通信,每一个套接字既可以读也可以写。例如,可以往sv[0]中写,从sv[1]中读;或者从sv[1]中写,从sv[0]中读;
- 如果往一个套接字(如sv[0])中写入后,再从该套接字读时会阻塞,只能在另一个套接字中(sv[1])上读成功;
- 读、写操作可以位于同一个进程,也可以分别位于不同的进程,如父子进程。如果是父子进程时,一般会功能分离,一个进程用来读,一个用来写。因为文件描述副sv[0]和sv[1]是进程共享的,所以读的进程要关闭写描述符, 反之,写的进程关闭读描述符。
举例:
1.1读写位于同一进程
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <error.h>
#include <errno.h>
#include <sys/socket.h>
#include <stdlib.h> const char* str = "SOCKET PAIR TEST.";int main(int argc, char* argv[]){char buf[128] = {0};int socket_pair[2]; pid_t pid; if(socketpair(AF_UNIX, SOCK_STREAM, 0, socket_pair) == -1 ) { printf("Error, socketpair create failed, errno(%d): %s\n", errno, strerror(errno));return EXIT_FAILURE; } int size = write(socket_pair[0], str, strlen(str));//可以读取成功;read(socket_pair[1], buf, size);printf("Read result: %s\n",buf);return EXIT_SUCCESS;
}
1.2 读写位于不同的进程
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <error.h>
#include <errno.h>
#include <sys/socket.h>
#include <stdlib.h> const char* str = "SOCKET PAIR TEST.";int main(int argc, char* argv[]){char buf[128] = {0};int socket_pair[2]; pid_t pid; if(socketpair(AF_UNIX, SOCK_STREAM, 0, socket_pair) == -1 ) { printf("Error, socketpair create failed, errno(%d): %s\n", errno, strerror(errno));return EXIT_FAILURE; } pid = fork();if(pid < 0) {printf("Error, fork failed, errno(%d): %s\n", errno, strerror(errno));return EXIT_FAILURE;} else if(pid > 0) {//关闭另外一个套接字close(socket_pair[1]);int size = write(socket_pair[0], str, strlen(str));printf("Write success, pid: %d\n", getpid());} else if(pid == 0) {//关闭另外一个套接字close(socket_pair[0]);read(socket_pair[1], buf, sizeof(buf)); printf("Read result: %s, pid: %d\n",buf, getpid());}for(;;) {sleep(1);}return EXIT_SUCCESS;
}
2. pipe函数
pipe函数使用
3. 区别
管道pipe是半双工的(即一个只能写,一个只能读),需要用两个pipe才能实现全双工,使得代码复杂。
socketpair直接就可以实现全双工,对两个文件描述符中的任何一个都可读和可写。
参考:socketpair函数的使用
《UNP》随笔——socketpair和pipe的区别相关推荐
- 【socket】 unix域套接字(socketpair )通信|socketpair和pipe的区别|进程间通信-Unix domain socket
目录 unix域套接字(socketpair )通信|socketpair和pipe的区别 socketpair机制 描述 原理 socketpair和pipe的区别 进程间通信-Unix domai ...
- 【socket】socket编程总目录
<C语言的Socket编程>https://blog.csdn.net/bandaoyu/article/details/83312254 <Python网络编程详解socket&g ...
- 总结系列——聊聊android里面的事件分发
前言 android 中的事件分发,已经是老生常谈的问题了,一般都是从Activity开始聊,但是真的是这样吗?hongyang大神之前一篇纠错,解决了我一个很大的困惑,也算是扫盲吧,这篇文章,是从头 ...
- UNIX域套接字编程和socketpair 函数
一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络soc ...
- 域间套接字socketpair
『域间套接字socketpair』 pipe用来创建管道,但是单个管道只能单向通信,一端用于读,而另一端用于写.如果要实现进程双向通信,必须创建一对管道,而socketpair则可以用来创建双向通信的 ...
- Linux考试试卷评讲
作 者: Lv 标 题: Linux考试试卷评讲 时 间: Mon Jul 25 19:49:02 2005 点 击: 55 考试终于批完了,其中发现很多上课中没有讲过的问题,这里把题目评讲一下: = ...
- linux fifo 视频,Linux FIFO学习
FIFO,又称作命名管道(named pipe),它是Linux系统中用于进程间通信的一种方法. FIFO和pipe的区别在于: FIFO在文件系统中有对应的inode,可以通过ls命令查看. sh- ...
- python—多进程之进程之间通信
一.Queue 1.导入:from multiprocessing import Queue 2.进程间数据通信之Queue示意图: mq.put(i) 子进程1发送数据到队列Queue中,子进程2和 ...
- python多进程间通信_python多进程间通信代码实例
python多进程间通信代码实例 这篇文章主要介绍了python多进程间通信代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 这里使用pipe ...
最新文章
- Linux 的账号与群组(转)
- [Spring cloud 一步步实现广告系统] 21. 系统错误汇总
- thinkphp5部署nginx服务上多站点解决方案!
- Python学习笔记:正则表达式
- 9路棋盘java代码_Java ServiceContext类代码示例
- java集合转js数值_前端js调用接口转换Map数组数据
- c语言求满足不等式的最小值,高手请进,请教一道简单的c语言题!
- Linux学习总结(51)——25个Linux服务器安全小贴士
- 专访McAfee“M双侠” 感受McAfee云安全自信
- oracle定义变量
- 计算机组成cpu的是,组成计算机cpu的两大部件
- Linux vps 主机有免费稳定的推荐吗?
- 六度分割理论和SNS
- Cubase中文版教程分享:如何通过音频剪辑软件创建工程
- 读《Java核心技术 卷I》有感之第3章 Java的基本程序设计结构
- 边缘计算和云计算之间,主要有什么优势?
- 华为云宝塔linux,华为云上安装宝塔面板
- 深入SpringBoot核心注解原理
- 会声会影浪漫婚礼视频——美到想哭
- cml sml区别_CAL.CML.SML的关系
热门文章
- MySql__为用户赋于主从同步的权限
- Python条件语句
- selenium自动化教务系统登入
- 手机计算机网络为什么神奇,神奇的小配件,手机壳指环扣为何如此火爆?
- 解决Word 生成目录时前导符不一致的问题(即通常所谓的目录中省略号大小不一致)...
- VMware无法获取IP地址问题,onboot=yes还是不显示IP
- java map初始化并赋值
- chain.doFilter详解
- 这是你想要的工作吗?灵隐寺招聘:没有KPI,佛系上班……
- 信息技术Information Technology