linux编程基础:使用socketpair实现双向通讯

article/2025/9/22 11:30:22

socketpair是linux提供的一种双向通讯机制,它通过socket实现双向通讯。socketpair本身虽然实现了双向通讯的功能,但是也存在一些限制:比如只能在一个进程的线程之间进行双向通讯或者是在具有亲缘关系的进程间进行通讯。所以socketpair很少情况下会单独使用,它往往需要和其他编程机制结合起来使用才能发挥它真正的作用。本文举两个小例子来说明一下socketpair的基本用法。

一、在一个进程的线程间实现双向通讯

这个例子实现的功能是:编写一个具有两个线程的应用程序,让主线程和子线程通过socketpair进行双向通讯。完整的代码实现如下:

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>/* 定义socketpair缓冲区的大小 */
#define SOCKET_BUFFER_SIZE 		((32) * (1024))#define BUFFER_SIZE		(256)	// 定义一个缓冲区的大小/**	定义子线程的主体函数*/
static void *thread_run_func (void *arg)
{int thread_fd = (int)arg;char thread_buf[BUFFER_SIZE] = {0};int readlen;/* a、向主进程发送一个消息 */printf("(1) send to main thread : %s\n", "Hello,world!");write(thread_fd, "Hello,world!", sizeof("Hello,world!"));/* d、接收主进程发送的消息 */readlen = read(thread_fd, thread_buf, BUFFER_SIZE);thread_buf[readlen] = '\0';printf("(4) recv from main thread : %s\n", thread_buf);
}/*	*	定义一个子线程,实现两个进程间的双向通讯*/
int main(int argc, char *argv[])
{int sockets[2];int result;int bufferSize;pthread_t thread;char main_buf[BUFFER_SIZE]= {0};int readlen;/* 创建一个socketpair双向通讯的实例 */result = socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets);if(-1 == result){printf("socketpair error!\n");return -1;}/* 设置socketpair双向通讯各个缓冲区 */bufferSize = SOCKET_BUFFER_SIZE;setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));/* 创建一个子线程用于和主线程之间进行双向通讯 */result = pthread_create(&thread, NULL, thread_run_func, (void *)sockets[1]);sleep(1);	/* 延时一段时间让子进程先于主进程运行 *//* b、接收子进程发送过来的消息 */readlen = read(sockets[0], main_buf, BUFFER_SIZE);main_buf[readlen] = '\0';printf("(2) recv from child thread : %s\n", main_buf);/* c、发送一个消息给子进程 */printf("(3) send to child thread : %s\n", "TECH-PRO");write(sockets[0], "TECH-PRO", sizeof("TECH-PRO"));sleep(1);	/* 延时一段等待子进程执行完毕 */return 0;
}
编译并运行,结果如下:


二、在父子进程间实现双向通讯

这个例子实现的功能是:编写一个应用程序,实现两个进程,让这两个进程之间实现双向通讯。完整代码如下所示:

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>/* 定义socketpair缓冲区的大小 */
#define SOCKET_BUFFER_SIZE 		((32) * (1024))#define BUFFER_SIZE		(256)	// 定义一个缓冲区的大小/*	*	定义一个子线程,实现两个进程间的双向通讯*/
int main(int argc, char *argv[])
{int sockets[2];int result;int bufferSize;pthread_t thread;char buf[BUFFER_SIZE]= {0};int readlen;int father_fd;int child_fd;/* 创建一个socketpair双向通讯的实例 */result = socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets);if(-1 == result){printf("socketpair error!\n");return -1;}/* 设置socketpair双向通讯各个缓冲区 */bufferSize = SOCKET_BUFFER_SIZE;setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &bufferSize, sizeof(bufferSize));setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &bufferSize, sizeof(bufferSize));father_fd = sockets[0];child_fd = sockets[1];/* 创建子进程 */result = fork();if(-1 == result){printf("fork error!\n");return -1;}else if(0 == result)	// 子进程{/* a、向主进程发送一个消息 */printf("(1) send to main thread : %s\n", "Hello,world!");write(child_fd, "Hello,world!", sizeof("Hello,world!"));/* d、接收主进程发送的消息 */readlen = read(child_fd, buf, BUFFER_SIZE);buf[readlen] = '\0';printf("(4) recv from main thread : %s\n", buf);}else if(result > 0)		// 父进程{sleep(1);	/* 延时一段时间让子进程先于主进程运行 *//* b、接收子进程发送过来的消息 */readlen = read(father_fd, buf, BUFFER_SIZE);buf[readlen] = '\0';printf("(2) recv from child thread : %s\n", buf);/* c、发送一个消息给子进程 */printf("(3) send to child thread : %s\n", "TECH-PRO");write(father_fd, "TECH-PRO", sizeof("TECH-PRO"));sleep(1);	/* 延时一段等待子进程执行完毕 */}return 0;
}
编译并运行,结果如下所示:



至此,两个简单的socketpair的小例子实现完毕。本人能力有限,文中有错误或者不合理的地方,请多指教。



http://chatgpt.dhexx.cn/article/mcK2d4sA.shtml

相关文章

socketpair函数用法

Unix套接字好像是套接字和管道的混合&#xff0c;socketpair()可以创建一对无命名的、相互连接的Unix域套接字。 管道历史上&#xff0c;它们是半双工的&#xff08;数据只能在一个方向上流动&#xff09;&#xff0c;但是现在也有全双工管道。管道只能在具有共同祖先的两个进…

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

目录 unix域套接字&#xff08;socketpair )通信|socketpair和pipe的区别 socketpair机制 描述 原理 socketpair和pipe的区别 进程间通信-Unix domain socket unix域套接字&#xff08;socketpair )通信|socketpair和pipe的区别 2020-12-25 10:13:34 socketpair机制 描…

Android framework socketpair

简述 在Linux中&#xff0c;socketpair函数可以用于创建一对相互连接的、通信域为AF_UNIX的套接字&#xff0c;其中一个套接字可用于读取&#xff0c;另一个套接字可用于写入。可以使用这对套接字在同一进程内进行进程间通信&#xff08;IPC&#xff09;。 以下是使用socketp…

socketpair的理解

参考博客链接&#xff1a; https://blog.51cto.com/liulixiaoyao/533469 socketpair创建了一对无名的套接字描述符&#xff08;只能在AF_UNIX域中使用&#xff09;&#xff0c;描述符存储于一个二元数组eg. s[2] 这对套接字可以进行双工通信&#xff0c;每一个描述符既可以读也…

android socket双向,Android中socketpair双向通信详解

Android很多地方会涉及到进程间的通信&#xff0c;比如输入系统&#xff0c;那么进程间通信会涉及哪些内容呢&#xff1f; 1、进程&#xff1a;负责读取和分发事件 2、应用程序&#xff1a;负责处理输入事件 上面这两个进程会涉及哪些双向通信呢&#xff1a; 1.进程会发送输入事…

Linux下socketpair系统API调用使用说明

目录 1.socketpair函数说明 2.socketpair使用举例 在阅读nginx源码时&#xff0c;发现其调用socketpair来实现master和worker进程之间进行数据交互。其代码如下&#xff1a; 思考&#xff1a;master和worker进程是父子关系&#xff0c;有亲属关系的进程通过pipe/pipe2&#x…

socketpair函数介绍及使用

摘要 在linux下&#xff0c;使用socketpair函数能够创建一对套节字进行进程间通信&#xff08;IPC&#xff09;。 函数原形&#xff1a; #include <sys/types.h> #include <sys/socket.h>int socketpair(int domain, int type, int protocol, int sv[2]); 参数…

socketpair机制

描述 先看下传统的CS模型&#xff0c;如下: 总是一方发起请求&#xff0c;等待另一方回应。当一次传输完成之后&#xff0c;client端发起新的请求之后&#xff0c;server端才作出回应。 那如何才能做到双向通信&#xff1f; 一种解决办法就是client端即使client&#xff0c;又…

【socketpair函数介绍及使用】

socketpair函数介绍及使用 函数原型进程间通信线程间通信 Linux环境下使用socketpair函数创造一对未命名的、相互连接的UNIX域套接字。   管道历史上&#xff0c;它们是半双工的&#xff08;数据只能在一个方向上流动&#xff09;&#xff0c;但是现在也有全双工管道。管道只…

LAMP架构超详细搭建步骤

LAMP介绍&#xff1a; LinuxApacheMysql/MariaDBPerl/PHP/Python一组常用来搭建或者服务器的开源软件&#xff0c;本身都是各自独立的程序&#xff0c;但是因为常被放在一起使用&#xff0c;拥有了越来越高的兼容度&#xff0c;共同组成了一个强大的Web应用程序平台。 目前LA…

LAMP架构介绍

转载自&#xff1a; https://blog.csdn.net/aoli_shuai/article/details/78745984 https://blog.csdn.net/sj349781478/article/details/84224440 一、LAMP介绍&#xff1a; LAMP是 linux Apache MySQL PHP的简写&#xff0c;即把Apache MySQL PHP 安装在linux系统上&#xff…

Lamp架构部署phpmadmin项目

Lamp架构部署phpmadmin项目 文章目录 Lamp架构部署phpmadmin项目官网下载phpmadmin的包测试登陆 官网下载phpmadmin的包 [phpMyAdmin]: 将下载好的包拖入目录里&#xff0c;并解压 [rootlocalhost ~]# cd /usr/src/ [rootlocalhost src]# lsapr-1.6.5 apr-1.6.5.tar.gz a…

【笔记】lamp架构框图

一、lamp架构 (1)、lamp基础结构 (2)、分布式lamp架构 (3)、实际运用 二、OSI七层和TCP/IP五层关系 这部分具体可以参考网址 (1)、OSI七层 OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互联。 一般都叫OSI参考模型&#xff0c;是ISO&…

LAMP服务架构

LAMP服务架构 文章目录 LAMP服务架构1. LAMP简介2. LAMP工作原理3. 部署LAMP3.1 源码安装http服务3.2 源码安装mysql数据库3.3 源码安装php3.2 apache和php配置 1. LAMP简介 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写 L代表服务器操作系统使用…

LAMP架构部署论坛

搭建论坛&#xff0c;要求为8080端口 安装LAMP 架构所需的服务&#xff0c;部分及插件 yum -y install mariadb mariadb-server mariadb-libs php php-mysql php-gd php-fpm php-cli gd httpd 启动服务&#xff1a;systemctl start httpd mariadb 设置数据库密码&#xff1a…

快速搭建LAMP架构

快速搭建LAMP架构 1.安装apache2.部署mysql3.部署php结合apache4.验证5.部署一个论坛disuz 1.安装apache [rootlocalhost ~]# yum install httpd -y 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile* base: mirrors.aliyun.com* …

LAMP架构简介与配置

文章目录 前言LAMP 简介与概述LAMP平台概述 构建LAMP平台顺序编译安装的优点各组件的主要作用 编译安装 Apache编译安装mysql安装PHP 前言 LAMP 简介与概述 LAMP平台概述 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整台系统和相关软件&#x…

搭建LAMP架构

搭建LAMP架构 一、LAMP架构概述 1、LAMP简介 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整台系统和相关软件&#xff0c;能够提供动态web站点服务及其应用开发环境。 LAMP是一个缩写词&#xff0c;具体包括Linux操作系统&#xff0c;Apache网…

LAMP架构简介与概述 及服务安装

目录 1、LAMP平台概述 &#xff08;1&#xff09;LAMP平台概述 &#xff08;2&#xff09;构建LAMP平台顺序 &#xff08;3&#xff09;编译安装的优点 &#xff08;4&#xff09;各组件的主要作用 2、Apache概述 &#xff08;1&#xff09; 安装Apache服务&#xff1a;…

什么是LAMP架构?

LAMP架构介绍 LAMP动态网站架构 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写。 1、LAMP分别代表什么&#xff1f; L代表服务器操作系统使用Linux A代表网站服务使用的是Apache软件基金会中的httpd软件 M代表网站后台使用的数据库是MySQL数…