当前位置: 首页 > news >正文

从零自制docker-9-【管道实现run进程和init进程传参】

文章目录

  • 命令行中输入参数长度过长
  • 匿名管道从父进程到子进程传参
  • `[]*os.File{}`
  • `os.NewFile`和`io.ReadAll`
  • exe.LookPath
  • syscall.Exec
  • `strings.Split(msgStr, " ")`
  • /bin/ls: cannot access '': No such file or directory
  • 代码

命令行中输入参数长度过长

用户输入参数过长或包含特殊字符时,该方案可能遇到的问题包括:

  1. 参数长度限制:大多数命令行环境对单个命令行参数的长度都有一定限制,超出这个限制后,参数可能无法完整传递给程序。解决方法是在程序中处理长参数时采用多参数模式或通过文件传递参数。

  2. 特殊字符转义问题:特殊字符如引号、空格、换行符等,在命令行中通常需要正确转义才能作为参数的一部分。例如,如果参数中包含空格,则应该将整个参数用双引号括起来(在POSIX兼容的shell中),如 "this is a long param with spaces"。在处理这类参数时,你的程序需要能够识别并正确解析这些转义规则。

  3. 内部处理逻辑问题:如果 Contain_init 函数内部没有做好对长参数或特殊字符的处理,那么即便参数能成功传入函数,也可能导致函数执行失败或不按预期工作。

匿名管道从父进程到子进程传参

  • 管道就是两个进程传输的一个中间缓存区
  • 管道一般固定大小4KB
  • 半双工(即一次只能在一个方向上传输数据)
  • 管道有空余地方才能写
  • 管道有被写的部分才能读

[]*os.File{}

在Go语言中,[]*os.File{} 是一个指向 os.File 类型的指针切片(slice)的初始化表达式。os.File 是Go标准库 os 包中的一个结构体类型,它代表一个打开的文件对象,可以是常规的磁盘文件,也可以是管道、终端设备等其他类型的I/O资源。

[]*os.File{} 表示一个存放 *os.File 类型指针的切片,其中的星号 * 表示指针,表示切片中的元素是指向 os.File 结构体的指针。

例如,[]*os.File{readPipe} 表示一个只包含一个元素的 os.File 指针切片,其中 readPipe 是一个已打开的 os.File 类型的指针。

在Go的 os/exec 包中,当我们创建一个 exec.Cmd 结构体实例来执行外部命令时,可以通过 Cmd.ExtraFiles 字段传递这样一个包含文件指针的切片。这样做的目的是在执行外部命令时,将这些文件描述符传递给子进程,以便子进程能够访问和操作这些文件资源,比如进行进程间通信(IPC)等。

os.NewFileio.ReadAll

在这段Go语言代码中,os.NewFileio.ReadAll 分别用于从底层文件描述符创建 os.File 对象和读取该文件的所有内容。

  1. pipe := os.NewFile(uintptr(fdIndex), "pipe")
    • fdIndex 是一个整数,表示一个已知的文件描述符索引。(因为3已经是传过来的文件描述符 因为每个进程默认都会有3个文件描述符,分别是标准输入、标准输出、标准错误。这3个是子进程一创建的时候就会默认带着的)
    • os.NewFile 函数接收两个参数:一个是文件描述符的数值表示(在这里转换为 uintptr 类型),另一个是给这个文件描述符起的名称(这里是字符串 “pipe”)。

os.NewFile 函数接收两个参数,第一个参数是一个 uintptr 类型的值,表示一个已存在的文件描述符;第二个参数是一个字符串,用于指定文件的名称(在这个上下文中,通常是一个描述性的名称,而非实际路径)。

  1. msg, err := io.ReadAll(pipe)
    • io.ReadAll 是一个从给定的 io.Reader 接口(在这里是 pipe,它实现了 io.Reader 接口)读取所有数据直到EOF(End Of File)为止的函数。
    • 它返回两个值:一个是读取到的数据(在这里是 msg 变量),类型是 []byte(字节数组);另一个是错误信息(err),如果读取过程中发生错误,err 将非空。
    • 这行代码尝试从刚才创建的 pipe 文件对象中读取所有的数据,并将读取到的内容存储在 msg 变量中。

exe.LookPath

在Go语言的 os/exec 包中,exec.LookPath 函数是一个用来查找给定可执行文件路径的函数。其原型如下:

func LookPath(name string) (string, error)

当你调用 exec.LookPath(cmdArray[0]) 时,cmdArray 一个字符串数组,其中 cmdArray[0] 是你想执行的命令或程序的名字(不包含其完整路径)。LookPath 函数会根据当前系统的环境变量 $PATH 来搜索这个名字对应的可执行文件的完整路径。

如果找到了对应可执行文件的路径,LookPath 函数会返回该路径;如果没有找到,则返回一个空字符串和一个错误对象。这个功能常用于在执行外部命令之前验证命令是否存在,这是执行 exec.Command 之前的一个常见前置步骤。

例如,假设你有一个 cmdArray := []string{"ls", "-l", "."},你想执行 ls -l . 命令。在执行命令前,你可能会先调用 exec.LookPath(cmdArray[0]) 来查找系统上是否存在名为 ls 的可执行文件。如果存在,接下来才会安全地创建和执行 exec.Command(cmdArray[0], cmdArray[1:]...)

syscall.Exec

https://xieys.club/go-syscall-exec/
https://gobyexample-cn.github.io/execing-processes

在这里插入图片描述

strings.Split(msgStr, " ")

strings.Split(msgStr, " ") 是 Go 语言中的一个字符串处理函数,来自 “strings” 包。这个函数接收两个参数:

  1. msgStr:这是一个字符串变量,你想在此字符串上执行分割操作。
  2. " ":这是分割符,一个空格字符,表示你希望通过空格来拆分 msgStr

函数执行后,它会返回一个字符串切片([]string 类型),其中的元素是 msgStr 按照空格分隔后的各个子串。例如,如果 msgStr"hello world how are you",那么执行 strings.Split(msgStr, " ") 之后的结果将会是 ["hello", "world", "how", "are", "you"]

这种操作常用于将一串以空格分隔的单词转换为单词列表,便于后续遍历、处理或分析。

/bin/ls: cannot access ‘’: No such file or directory

由于

err:=syscall.Exec("/bin/ls",argv,os.Environ())

argv为["/bin/ls",""]就会出现这样的问题,解决办法就是把""对应的这个从切片中去掉。也不知道为啥会这样,可能是Split的机制导致

如果有尾部的空格字符,分割结果中自会包含因尾部空格产生的空字符串元素。

代码

https://github.com/FULLK/llkdocker/tree/main/pipe_docker

相关文章:

从零自制docker-9-【管道实现run进程和init进程传参】

文章目录 命令行中输入参数长度过长匿名管道从父进程到子进程传参[]*os.File{}os.NewFile和io.ReadAllexe.LookPathsyscall.Execstrings.Split(msgStr, " ")/bin/ls: cannot access : No such file or directory代码 命令行中输入参数长度过长 用户输入参数过长或包…...

全量知识系统 程序详细设计 之 三种“活物” 之1(QA百度搜索 )

Q1. 今天聊聊 全知系统中 三种“活物”。先从他们的一个简单描述开始: 自主:计算机“集群”的“沉”与“浮”; 自然:AI “众生”的“世”和“界” ;自由:人类 “公民”的“宇”或“宙”。 全知系统中的三…...

QT 线程之movetothread

上文列举了qt中线程的几种方法,其中2种方法最为常见。 这两种方法都少不了QThread类,前者继承于QThread类,后者复合QThread类。 本文以实例的方式描述了movetothread()这种线程的方法,将QObject的子类移动…...

如何处理ubuntu22.04LTS安装过程中出现“Daemons using outdated libraries”提示

Ubuntu 22.04 LTS 中使用命令行升级软件或安装任何新软件时,您可能收到“Daemons using outdated libraries”,“Which services should be restarted?”的提示,提示下面列出备选的重启服务,如下。 使用以下命令,能够…...

跟TED演讲学英文:The inside story of ChatGPT‘s astonishing potential by Greg Brockman

The inside story of ChatGPT’s astonishing potential Link: https://www.ted.com/talks/greg_brockman_the_inside_story_of_chatgpt_s_astonishing_potential Speaker: Greg Brockman Date:April 2023 文章目录 The inside story of ChatGPTs astonishing potentialIntro…...

mybatis05:复杂查询:(多对一,一对多)

mybatis05:复杂查询:(多对一,一对多) 文章目录 mybatis05:复杂查询:(多对一,一对多)前言:多对一 : 关联 : 使用associatio…...

微电网优化:基于肝癌算法(Liver Cancer algorithm, LCA)的微电网优化(提供MATLAB代码)

一、微电网优化模型 微电网是一个相对独立的本地化电力单元,用户现场的分布式发电可以支持用电需求。为此,您的微电网将接入、监控、预测和控制您本地的分布式能源系统,同时强化供电系统的弹性,保障您的用电更经济。您可以在连接…...

VUE_H5页面跳转第三方地图导航,兼容微信浏览器

当前项目是uniapp项目,若不是需要替换uni.showActionSheet选择api onMap(address , organName , longitude 0, latitude 0){var ua navigator.userAgent.toLowerCase();var isWeixin ua.indexOf(micromessenger) ! -1;if(isWeixin) {const mapUrl_tx "…...

智慧安全运营:智能化运维,确保服务无忧

智慧安全运营:智能化运维,确保服务无忧 中国联通新一代全球智云数据中心采用先进的智能化运维管理系统,实现对数据中心设施、IT设备、能源消耗、环境参数等全方位、实时监控。通过物联网技术、人工智能算法以及大数据分析,运维团…...

R-tree总结

引言: 在处理空间数据和地理信息系统(GIS)中,高效的空间索引机制对于提升查询性能至关重要。R-tree是一种流行的平衡树数据结构,专门用于索引多维信息,如二维的地理坐标或三维的物体位置。它以其灵活性、高…...

Python 与机器学习,在服务器使用过程中,常用的 Linux 命令包括哪些?

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 本博客旨在分享在实际开发过程中,开发者需要了解并熟练运用的 Linux 操作系统常用命令。Linux 作为一种操作系统,与 Windows 或 MacOS 并驾齐驱,尤其在服务器和开发环…...

js通过Object.defineProperty实现数据响应式

目录 数据响应式属性描述符propertyResponsive 依赖收集依赖队列寻找依赖 观察器 派发更新Observer完整代码关于数据响应式关于Object.defineProperty的限制 数据响应式 假设我们现在有这么一个页面 <!DOCTYPE html> <html lang"en"><head><m…...

docker最简单教程(使用dockerfile构建环境)

一 手里有的东西 安装好的docker+dockerfile 二 操作 只需要在你的dockerfile文件下执行命令 docker build -t="xianhu/centos:gitdir" . 将用户名、操作系统和tag进行修改就可以了,这就相当于在你本地安装了一个docker环境,然后执行 docker run -it xianhu/ce…...

Vue2 —— 学习(三)

目录 一、绑定 class 样式 &#xff08;一&#xff09;字符串写法 1.流程介绍 2.代码实现 &#xff08;二&#xff09;数组写法 1.流程介绍 2.代码实现 &#xff08;三&#xff09;对象写法 1.流程介绍 2.代码实现 二、绑定 style 样式&#xff08;了解&#xff…...

Qt Creator 12.0.2 debug 无法查看变量的值 Expression too Complex

鼠标放在局部变量上提示“expression too complex”。 在调试窗口也看不到局部变量的值。 这应该是qt的一个bug&#xff0c;https://bugreports.qt.io/browse/QTCREATORBUG-24180 暂时解决方法&#xff1a; 如下图&#xff0c;需要右键项目然后执行"Clean"和&quo…...

LeetCode-Java:303、304区域检索(前缀和)

文章目录 题目303、区域和检索&#xff08;数组不可变&#xff09;304、二维区域和检索&#xff08;矩阵不可变&#xff09; 解①303&#xff0c;一维前缀和②304&#xff0c;二维前缀和 算法前缀和一维前缀和二维前缀和 题目 303、区域和检索&#xff08;数组不可变&#xff…...

出海业务的网络安全挑战

出海业务的扩展带来了巨大的市场机遇&#xff0c;同时也带来了不少网络安全挑战&#xff1a; 数据泄露与隐私保护&#xff1a;跨境数据传输增加了数据被截获和泄露的风险。地理位置限制和审查&#xff1a;某些地区的网络审查和地理位置限制可能阻碍企业正常开展业务。网络攻击…...

蓝桥杯考前准备— — c/c++

蓝桥杯考前准备— — c/c 对于输入输出函数 如果题目中有要求规定输入数据的格式与输出数据的格式&#xff0c;最好使用scanf()和prinrf()函数。 例如&#xff1a;输入的数据是 2020-02-18&#xff0c;则使用scanf("%d-%d-%d",&year,&mouth,&day)即可…...

【MATLAB源码-第4期】基于MATLAB的1024QAM误码率曲线,以及星座图展示。

1、算法描述 正交幅度调制&#xff08;QAM&#xff0c;Quadrature Amplitude Modulation&#xff09;是一种在两个正交载波上进行幅度调制的调制方式。这两个载波通常是相位差为90度&#xff08;π/2&#xff09;的正弦波&#xff0c;因此被称作正交载波。这种调制方式因此而得…...

数据结构-----枚举、泛型进阶(通配符?)

文章目录 枚举1 背景及定义2 使用3 枚举优点缺点4 枚举和反射4.1 枚举是否可以通过反射&#xff0c;拿到实例对象呢&#xff1f; 5 总结 泛型进阶1 通配符 ?1.1 通配符解决什么问题1.2 通配符上界1.3 通配符下界 枚举 1 背景及定义 枚举是在JDK1.5以后引入的。主要用途是&am…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...