Android framework socketpair

article/2025/9/22 11:42:20

简述

在Linux中,socketpair函数可以用于创建一对相互连接的、通信域为AF_UNIX的套接字,其中一个套接字可用于读取,另一个套接字可用于写入。可以使用这对套接字在同一进程内进行进程间通信(IPC)。

以下是使用socketpair函数创建套接字对的基本步骤:

  1. 包含头文件 sys/types.hsys/socket.hunistd.h

  2. 声明一个长度为2的数组作为套接字描述符的参数。

  3. 调用 socketpair 函数,并将套接字描述符数组作为参数传递给它。函数原型为:

    int socketpair(int domain, int type, int protocol, int sv[2]);
    
    • domain参数指定通信域,通常设置为AF_UNIX。
    • type参数指定套接字类型,可以设置为SOCK_STREAMSOCK_DGRAM
    • protocol参数通常设置为0,表示使用默认协议。
    • sv参数是一个长度为2的整数数组,用于保存创建的套接字描述符。
  4. 使用sv数组中的套接字描述符进行进程间通信。

Linux举例

下面是一个基于 socketpair 的简单例子,用于在父子进程之间传递数据:

#include <unistd.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>int main() {int sockfd[2];char buf[1024];pid_t pid;if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockfd) < 0) {perror("socketpair");return 1;}if ((pid = fork()) == -1) {perror("fork");return 1;}if (pid == 0) {  // 子进程close(sockfd[0]);char msg[] = "Hello, parent!";if (write(sockfd[1], msg, strlen(msg)) < 0) {perror("write");return 1;}close(sockfd[1]);} else {  // 父进程close(sockfd[1]);int n = read(sockfd[0], buf, sizeof(buf));if (n < 0) {perror("read");return 1;}printf("Parent: received message from child: %s\n", buf);close(sockfd[0]);}return 0;
}

该程序首先调用 socketpair 函数创建一对 UNIX 域套接字,存储在 sockfd 数组中。然后,程序调用 fork 函数创建一个子进程。在子进程中,它关闭 sockfd[0],然后将一条消息写入 sockfd[1],然后关闭 sockfd[1]。在父进程中,它关闭 sockfd[1],然后从 sockfd[0] 中读取一条消息,并将其打印到标准输出中,最后关闭 sockfd[0]

当该程序运行时,它会创建一个子进程,子进程向父进程发送一条消息,父进程接收到该消息并将其打印出来:

Parent: received message from child: Hello, parent!

Android framework 举例

android-12.0.0_r28/frameworks/native/libs/sensor/BitTube.cpp

BitTube
void BitTube::init(size_t rcvbuf, size_t sndbuf) {int sockets[2];if (socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets) == 0) {size_t size = DEFAULT_SOCKET_BUFFER_SIZE;setsockopt(sockets[0], SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf));setsockopt(sockets[1], SOL_SOCKET, SO_SNDBUF, &sndbuf, sizeof(sndbuf));// sine we don't use the "return channel", we keep it small...setsockopt(sockets[0], SOL_SOCKET, SO_SNDBUF, &size, sizeof(size));setsockopt(sockets[1], SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));fcntl(sockets[0], F_SETFL, O_NONBLOCK);fcntl(sockets[1], F_SETFL, O_NONBLOCK);mReceiveFd = sockets[0];mSendFd = sockets[1];} else {mReceiveFd = -errno;ALOGE("BitTube: pipe creation failed (%s)", strerror(-mReceiveFd));}
}

BitTube.cpp 是 Android 中传感器服务和传感器驱动程序之间通信使用的 BitTube 类的实现文件。

InputTransport

android-12.0.0_r28/frameworks/native/libs/input/InputTransport.cpp

status_t InputChannel::openInputChannelPair(const std::string& name,std::unique_ptr<InputChannel>& outServerChannel,std::unique_ptr<InputChannel>& outClientChannel) {int sockets[2];if (socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets)) {status_t result = -errno;ALOGE("channel '%s' ~ Could not create socket pair.  errno=%s(%d)", name.c_str(),strerror(errno), errno);outServerChannel.reset();outClientChannel.reset();return result;}int 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));sp<IBinder> token = new BBinder();std::string serverChannelName = name + " (server)";android::base::unique_fd serverFd(sockets[0]);outServerChannel = InputChannel::create(serverChannelName, std::move(serverFd), token);std::string clientChannelName = name + " (client)";android::base::unique_fd clientFd(sockets[1]);outClientChannel = InputChannel::create(clientChannelName, std::move(clientFd), token);return OK;
}

在 Android Input 系统中,InputTransport 使用 socketpair 函数创建一对全双工的本地套接字(socket),用于在应用程序和驱动程序之间传递输入事件。其中一个套接字用于向驱动程序发送输入事件,另一个套接字用于接收来自驱动程序的输入事件。通过这种方式,InputTransport 可以将输入事件发送到驱动程序,并接收驱动程序生成的输入事件。


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

相关文章

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数…

【ubuntu】搭建lamp架构

文章目录 一、准备工作1、更新源2、更新软件3、防火墙UFW 二、安装apache21、安装apache包2、网页浏览查看 三、安装mysql1、安装mysql2、查看mysql3、设置mysql数据库的密码 四、安装PHP1、安装php包以及插件2、测试php包 五、安装wordpress1、获取wordpress的压缩包2、上传压…

腾讯云— LAMP 架构个人实践分享

LAMP 环境通常指Linux 环境下&#xff0c;由ApacheMySQL/MariaDBPHP 以及其它相关组件组成的网站服务器架构。目前以LAMP组成的Web 应用程序平台广泛被应用&#xff0c;70%以上的访问流量由LAMP提供&#xff0c;所以我们也认同LAMP是最强大的网站解决方案。 关于LAMP的环境部署…

一:LAMP 架构简介

一&#xff1a;LAMP 架构简介 LAMP 是目前成熟的一种企业网站应用模式之一&#xff0c;指的是协同工作的一套系统和相关软件的整合&#xff0c;可提供PHP动态web站点应用及开发环境&#xff0c;LAMP 经过十年的完善各个组件间的兼容性&#xff0c;协作能力&#xff0c;稳定等方…