文章目录

  • 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中。

基本用法:

  1. 这对套接起sv[2]可以用于全双工通信,每一个套接字既可以读也可以写。例如,可以往sv[0]中写,从sv[1]中读;或者从sv[1]中写,从sv[0]中读;
  2. 如果往一个套接字(如sv[0])中写入后,再从该套接字读时会阻塞,只能在另一个套接字中(sv[1])上读成功;
  3. 读、写操作可以位于同一个进程,也可以分别位于不同的进程,如父子进程。如果是父子进程时,一般会功能分离,一个进程用来读,一个用来写。因为文件描述副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的区别相关推荐

  1. 【socket】 unix域套接字(socketpair )通信|socketpair和pipe的区别|进程间通信-Unix domain socket

    目录 unix域套接字(socketpair )通信|socketpair和pipe的区别 socketpair机制 描述 原理 socketpair和pipe的区别 进程间通信-Unix domai ...

  2. 【socket】socket编程总目录

    <C语言的Socket编程>https://blog.csdn.net/bandaoyu/article/details/83312254 <Python网络编程详解socket&g ...

  3. 总结系列——聊聊android里面的事件分发

    前言 android 中的事件分发,已经是老生常谈的问题了,一般都是从Activity开始聊,但是真的是这样吗?hongyang大神之前一篇纠错,解决了我一个很大的困惑,也算是扫盲吧,这篇文章,是从头 ...

  4. UNIX域套接字编程和socketpair 函数

    一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络soc ...

  5. 域间套接字socketpair

    『域间套接字socketpair』 pipe用来创建管道,但是单个管道只能单向通信,一端用于读,而另一端用于写.如果要实现进程双向通信,必须创建一对管道,而socketpair则可以用来创建双向通信的 ...

  6. Linux考试试卷评讲

    作 者: Lv 标 题: Linux考试试卷评讲 时 间: Mon Jul 25 19:49:02 2005 点 击: 55 考试终于批完了,其中发现很多上课中没有讲过的问题,这里把题目评讲一下: = ...

  7. linux fifo 视频,Linux FIFO学习

    FIFO,又称作命名管道(named pipe),它是Linux系统中用于进程间通信的一种方法. FIFO和pipe的区别在于: FIFO在文件系统中有对应的inode,可以通过ls命令查看. sh- ...

  8. python—多进程之进程之间通信

    一.Queue 1.导入:from multiprocessing import Queue 2.进程间数据通信之Queue示意图: mq.put(i) 子进程1发送数据到队列Queue中,子进程2和 ...

  9. python多进程间通信_python多进程间通信代码实例

    python多进程间通信代码实例 这篇文章主要介绍了python多进程间通信代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 这里使用pipe ...

最新文章

  1. Linux 的账号与群组(转)
  2. [Spring cloud 一步步实现广告系统] 21. 系统错误汇总
  3. thinkphp5部署nginx服务上多站点解决方案!
  4. Python学习笔记:正则表达式
  5. 9路棋盘java代码_Java ServiceContext类代码示例
  6. java集合转js数值_前端js调用接口转换Map数组数据
  7. c语言求满足不等式的最小值,高手请进,请教一道简单的c语言题!
  8. Linux学习总结(51)——25个Linux服务器安全小贴士
  9. 专访McAfee“M双侠” 感受McAfee云安全自信
  10. oracle定义变量
  11. 计算机组成cpu的是,组成计算机cpu的两大部件
  12. Linux vps 主机有免费稳定的推荐吗?
  13. 六度分割理论和SNS
  14. Cubase中文版教程分享:如何通过音频剪辑软件创建工程
  15. 读《Java核心技术 卷I》有感之第3章 Java的基本程序设计结构
  16. 边缘计算和云计算之间,主要有什么优势?
  17. 华为云宝塔linux,华为云上安装宝塔面板
  18. 深入SpringBoot核心注解原理
  19. 会声会影浪漫婚礼视频——美到想哭
  20. cml sml区别_CAL.CML.SML的关系

热门文章

  1. MySql__为用户赋于主从同步的权限
  2. Python条件语句
  3. selenium自动化教务系统登入
  4. 手机计算机网络为什么神奇,神奇的小配件,手机壳指环扣为何如此火爆?
  5. 解决Word 生成目录时前导符不一致的问题(即通常所谓的目录中省略号大小不一致)...
  6. VMware无法获取IP地址问题,onboot=yes还是不显示IP
  7. java map初始化并赋值
  8. chain.doFilter详解
  9. 这是你想要的工作吗?灵隐寺招聘:没有KPI,佛系上班……
  10. 信息技术Information Technology