从零自制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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/310980.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SOLIDWORKS 2024教育版全套多少钱?

SOLIDWORKS 2024教育版全套是一款专为教育机构和学生设计的3D CAD设计软件套装。它集合了SOLIDWORKS的核心功能和工具,旨在帮助学生在学习和实践过程中掌握先进的工程设计和制造技术。对于教育机构和学生而言,了解SOLIDWORKS 2024教育版全套的价格成为了…

深度探索:Secure Hash Algorithm(SHA)全景解析

title: 深度探索:Secure Hash Algorithm(SHA)全景解析 date: 2024/4/15 18:33:17 updated: 2024/4/15 18:33:17 tags: SHA安全抗碰撞性算法版本实现细节性能优化发展历史应用案例 密码学中的哈希函数 一、哈希函数的定义 哈希函数是一种数…

快来看!这样的统计地图真的很好绘制的~~

之前有小伙伴再讨论群里提问关于分级统计地图(choropleth maps) 的绘制方法,刚开始看到这个问题的时候觉得比较简单,就给出了几个处理方法,有R的也有基于Python 的,但后来和提问小伙伴一聊,才知道是要绘制一个有 ”三元…

2024五一杯数学建模C题思路分析

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间:2024…

四.音视频编辑-音频混合-概述

引言 当我们在前两篇博客中成功地构建了一个媒体组合,并且略过了音频部分时,我们意识到了我们需要对这个项目进行更详细的探讨。在本篇博客中,我们将会展示如何创建一个包含视频轨道、配音音频轨道以及背景音频轨道的完整媒体组合。更进一步…

lua 环境安装

下载地址: https://luabinaries.sourceforge.net/download.html 安装环境变量 检查一下是否安装成功,有版本号,打印一句话,如下表示成功 idea 安装插件,方便编写lua脚本 配置一下idea 运行测试 local function m…

经典文献阅读之--Light-LOAM( 基于图匹配的轻量级激光雷达里程计和地图构建)

0. 简介 将SLAM应用于机器人应用中,可靠性和效率是两个最受重视的特性。本文《Light-LOAM: A Lightweight LiDAR Odometry and Mapping based on Graph-Matching》考虑在计算能力有限的平台上实现可靠的基于激光雷达的SLAM功能。首先与大多数选择点云配准的显著特征…

国税发票查验接口、电子增值税发票查验接口、数电票查验接口

翔云发票查验接口支持增值税发票管理系统开具发票的真伪,通过发票代码、号码、日期、金额、校验码四要素信息进行真伪的查验,支持返回全票面信息,API接口便于集成,可适用于多种应用场景。 发票查验接口python调用示例:…

正则表达式(Regular Expression)

正则表达式很重要,是一个合格攻城狮的必备利器,必须要学会!!! (参考视频)10分钟快速掌握正则表达式(奇乐编程学院)https://www.bilibili.com/video/BV1da4y1p7iZ在线测试…

分布式监控平台---Zabbix

一、Zabbix概述 作为一个运维,需要会使用监控系统查看服务器状态以及网站流量指标,利用监控系统的数据去了解上线发布的结果,和网站的健康状态。 利用一个优秀的监控软件,我们可以: 通过一个友好的界面进行浏览整个…

CSRF漏洞详解

目录 什么是同源策略 什么是csrf CSRF 攻击会产生什么影响? CSRF漏洞low等级复现 什么是同源策略 协议相同 域名相同 端口相同 什么是csrf 跨站请求伪造(也称为 CSRF)是一种 Web 安全漏洞,允许攻击者诱导用户执行他们不打…

华为各级OD薪资曝光。。

华为 OD 薪资 之前写过几篇华为 OD 的算法题,后来有不少同学问起,华为 OD 薪资到底怎么样。 华为 OD 的薪资待遇,网上信息不多,只找到一篇相对靠谱的爆料: 上述是月 base 的爆料,然后通常 OD 是 15-16 薪。…

如何连通私有子网中的 MSK / Kafka 集群?

MSK 集群通常都是建在私有子网中的,这给本地访问带来了很多麻烦,特别是需要在本地使用 Kafka GUI 客户端管理和读写 MSK 数据的时候。本文会给出一套解决方案。 我们这里讨论的问题有一点特殊性,那就是:由于 MSK 是托管服务&…

标准版uni-app移动端页面添加/开发操作流程

页面简介 uni-app项目中,一个页面就是一个符合Vue SFC规范的.vue文件或.nvue文件。 .vue页面和.nvue页面,均全平台支持,差异在于当uni-app发行到App平台时,.vue文件会使用webview进行渲染,.nvue会使用原生进行渲染。…

单元测试四大过程

单元测试四大过程(蓝桥课学习笔记) 单元测试过程 单元测试是软件测试过程中的一个关键环节,它与集成测试、系统测试一样,分为测试策划、测试设计、测试执行和测试总结几个阶段。 单元测试过程中每个阶段需要完成的主要工作如下&…

Ubuntu配置VScode的C++环境

在Ubuntu系统下配置C环境,并运行helloworld 1. 下载VScode 我这里使用的是星火应用商店,在商店里面可以直接下载安装 http://spark-app.store/ 2.创建文件夹 3.启动VScode并打开该文件夹 4.安装以下几个扩展 PS:Clang这个插件别安装&…

使用TomCat写Film前后端项目0414

使用TomCat写Film前后端项目源文件0414-CSDN博客 实现功能: 得到数据库所有电影数据在首页显示出来 添加 删除 修改 点击修改,获取编号id,传入到根据id编号查询数据的控制器转发数据到 修改的jsp页面。 获取修改数据传入到根据id修改数据的控…

【word2pdf】Springboot word转pdf(自学使用)

文章目录 概要整体介绍具体实现官网pom文件增加依赖 遇到的问题本地运行OK,发布到Linux报错还是本地OK,但是Linux能运行的,但是中文乱码 小结 概要 Springboot word 转 pdf 整体介绍 搜了一下,发现了能实现功能的方法有四种 U…

JDBC 数据库连接

文章目录 JDBC核心技术第1章:JDBC概述1.1 数据的持久化1.2 Java中的数据存储技术1.3 JDBC介绍1.4 JDBC体系结构1.5 JDBC程序编写步骤 第2章:获取数据库连接三要素2.1 要素一:Driver接口实现类2.1.1 Driver接口介绍2.1.2 加载与注册JDBC驱动 2…

SETR——Rethinking系列工作,展示使用纯transformer在语义分割任务上是可行的,但需要很强的训练技巧

题目:Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers 作者: 开源:https://fudan-zvg.github.io/SETR 1.研究背景 1.1 为什么要研究这个问题? 自[ 36 ]的开创性工作以来,现有的语义分割模型主要是**基于全卷积网络( FCN )的…