从零自制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
- 代码
命令行中输入参数长度过长
用户输入参数过长或包含特殊字符时,该方案可能遇到的问题包括:
-
参数长度限制:大多数命令行环境对单个命令行参数的长度都有一定限制,超出这个限制后,参数可能无法完整传递给程序。解决方法是在程序中处理长参数时采用多参数模式或通过文件传递参数。
-
特殊字符转义问题:特殊字符如引号、空格、换行符等,在命令行中通常需要正确转义才能作为参数的一部分。例如,如果参数中包含空格,则应该将整个参数用双引号括起来(在POSIX兼容的shell中),如
"this is a long param with spaces"
。在处理这类参数时,你的程序需要能够识别并正确解析这些转义规则。 -
内部处理逻辑问题:如果
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.NewFile
和io.ReadAll
在这段Go语言代码中,os.NewFile
和 io.ReadAll
分别用于从底层文件描述符创建 os.File
对象和读取该文件的所有内容。
pipe := os.NewFile(uintptr(fdIndex), "pipe")
:fdIndex
是一个整数,表示一个已知的文件描述符索引。(因为3已经是传过来的文件描述符 因为每个进程默认都会有3个文件描述符,分别是标准输入、标准输出、标准错误。这3个是子进程一创建的时候就会默认带着的)os.NewFile
函数接收两个参数:一个是文件描述符的数值表示(在这里转换为uintptr
类型),另一个是给这个文件描述符起的名称(这里是字符串 “pipe”)。
os.NewFile 函数接收两个参数,第一个参数是一个 uintptr 类型的值,表示一个已存在的文件描述符;第二个参数是一个字符串,用于指定文件的名称(在这个上下文中,通常是一个描述性的名称,而非实际路径)。
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” 包。这个函数接收两个参数:
msgStr
:这是一个字符串变量,你想在此字符串上执行分割操作。" "
:这是分割符,一个空格字符,表示你希望通过空格来拆分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 样式 (一)字符串写法 1.流程介绍 2.代码实现 (二)数组写法 1.流程介绍 2.代码实现 (三)对象写法 1.流程介绍 2.代码实现 二、绑定 style 样式(了解ÿ…...
Qt Creator 12.0.2 debug 无法查看变量的值 Expression too Complex
鼠标放在局部变量上提示“expression too complex”。 在调试窗口也看不到局部变量的值。 这应该是qt的一个bug,https://bugreports.qt.io/browse/QTCREATORBUG-24180 暂时解决方法: 如下图,需要右键项目然后执行"Clean"和&quo…...
LeetCode-Java:303、304区域检索(前缀和)
文章目录 题目303、区域和检索(数组不可变)304、二维区域和检索(矩阵不可变) 解①303,一维前缀和②304,二维前缀和 算法前缀和一维前缀和二维前缀和 题目 303、区域和检索(数组不可变ÿ…...
出海业务的网络安全挑战
出海业务的扩展带来了巨大的市场机遇,同时也带来了不少网络安全挑战: 数据泄露与隐私保护:跨境数据传输增加了数据被截获和泄露的风险。地理位置限制和审查:某些地区的网络审查和地理位置限制可能阻碍企业正常开展业务。网络攻击…...
蓝桥杯考前准备— — c/c++
蓝桥杯考前准备— — c/c 对于输入输出函数 如果题目中有要求规定输入数据的格式与输出数据的格式,最好使用scanf()和prinrf()函数。 例如:输入的数据是 2020-02-18,则使用scanf("%d-%d-%d",&year,&mouth,&day)即可…...
【MATLAB源码-第4期】基于MATLAB的1024QAM误码率曲线,以及星座图展示。
1、算法描述 正交幅度调制(QAM,Quadrature Amplitude Modulation)是一种在两个正交载波上进行幅度调制的调制方式。这两个载波通常是相位差为90度(π/2)的正弦波,因此被称作正交载波。这种调制方式因此而得…...
数据结构-----枚举、泛型进阶(通配符?)
文章目录 枚举1 背景及定义2 使用3 枚举优点缺点4 枚举和反射4.1 枚举是否可以通过反射,拿到实例对象呢? 5 总结 泛型进阶1 通配符 ?1.1 通配符解决什么问题1.2 通配符上界1.3 通配符下界 枚举 1 背景及定义 枚举是在JDK1.5以后引入的。主要用途是&am…...
线上问题监控 Sentry 接入全过程
背景: 线上偶发问题出现后 ,测试人员仅通过接口信息无法复现错误场景;并且线上环境的监控,对于提高系统的稳定性 (降低脱发率) 至关重要;现在线上监控工具这个多,为什么选择Sentry?…...
【数据库(MySQL)基础】以MySQL为例的数据库基础
文章目录 0. 本文用到的emp表,dept表,salgrade表1. MySQL入门2. 简单查询3. 字段计算4. 条件查询4.1 and4.2 null4.3 or4.4 and和or的优先级4.4 in 和 not in4.5 模糊查询 5. 排序5.1 简单排序5.2 两个字段排序5.3 综合排序 6. 一些常用函数6.1 大小写转换6.2 substr子字符串6.…...
权限修饰符,代码块,抽象类,接口.Java
1,权限修饰符 权限修饰符:用来控制一个成员能够被访问的范围可以修饰成员变量,方法,构造方法,内部类 👻👗👑权限修饰符的分类 🧣四种作用范围由小到大(private<空着…...
CSS设置文本
目录 概述: text-aling: text-decoration: text-transform: text-indent: line-height: letter-spacing: word-spacing: text-shadow: vertical-align: white-space: direction: 概述: 在CSS中我们可以设置文本的属性,就像Word文…...
【svg】—— java提取svg中的颜色
需要针对svg元素进行解析,并提取其中的颜色,首先需要知道svg中的颜色。针对svg中颜色的格式大致可以一般有纯色和渐变两种形式。对于渐变有分为:线性渐变和放射性渐变针对svg中的颜色支持16进制的格式,又可以支持RGB的格式&#x…...
论文分享 | FAST'23 阿里云提出的针对SMR优化的存储引擎SMRSTORE
今天分享的一篇最近阅读的论文是FAST23的SMRstore: A Storage Engine for Cloud Object Storage on HM-SMR Drives。 https://www.usenix.org/conference/fast23/presentation/zhou 这篇文章是由阿里巴巴公司完成的,在这篇文章中,团队针对SMR的特性提出了…...
题目:建造房屋 (蓝桥OJ3362)
问题描述: 代码: #include<bits/stdc.h> using namespace std; int n, m, k, ans, mod 1e9 7; long long dp[55][2605]; /*dp[i][j]:第i个街道上建j个房屋的总方案数枚举所有的转移,累加到dp[n][k]即总方案数 */ int main() {cin >> n &…...
智能合约平台开发指南
随着区块链技术的普及,智能合约平台已经成为了这个领域的一个重要趋势。智能合约可以自动化执行合同条款,大大减少了执行和监督合同条款所需的成本和时间。那么,如何开发一个智能合约平台呢?以下是一些关键步骤。 一、选择合适的区…...
数学建模-最优包衣厚度终点判别法(主成分分析)
💞💞 前言 hello hello~ ,这里是viperrrrrrr~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页ÿ…...
Mysql内存表及使用场景(12/16)
内存表(Memory引擎) InnoDB引擎使用B树作为主键索引,数据按照索引顺序存储,称为索引组织表(Index Organized Table)。 Memory引擎的数据和索引分开存储,数据以数组形式存放,主键索…...
网络博彩网站怎么做的/网络营销教学大纲
前面说到微软打算在 Win12 出来前搞出个模块化的Windows:下一个系统不是Win12,微软要复活Win10X。 模块化不用小蝾再过多介绍了,就像积木一样拼在一起组成一个整体。 优势就很明显了,由于每个部分都是单独的模块,更新…...
wordpress特效主题/网站建设网络推广平台
关于分页显示方面的文章,网上搜索会有好几大箩,当然每个人都有自己的思路和出发点。我的基本思路也很简单,就是将搜索过程分为两个部分:“预搜索”和“分页显示”。预搜索负责查询记录主键ID集,并且在整个查询分页过程…...
网站建设比较好的/卡点视频免费制作软件
目录 替换功能 String replace(char old,char new)String replace(String old,String new) 去除字符串两空格 String trim() 按字典顺序比较两个字符串 int compareTo(String str)int compareToIgnoreCase(String str) 点击下方链接学习更多的String类 API深入研究 字符…...
网站设计 工作/完美日记网络营销策划书
原文出处:https://segmentfault.com/a/1190000010371988 看了一下这篇文章,自己也手敲了一遍 //1、 立即执行函数 作用:将var变量的作用域限制于函数内,这样可以避免命名冲突。注意:避免报错 在开头加分号;(function…...
简约网站设计欣赏/整站seo技术搜索引擎优化
今天我们团队进行了数据输出和数据处理两个任务,我在完成数据输出任务后,和马世杰一起进行了数据处理的后续任务,站立会议我们们讨论遇到的问题有:在计算归零观测值时没有分析出具体算法。 转载于:https://www.cnblogs.com/nigula…...
360做网站吗/seo公司培训课程
人偶工具 Puppet Tools根据控点(也称“操控点” Pin)位置,对图像的不同部位进行拉伸、挤压、伸展及其它变形处理,类似于 Ps 中的“操控变形”命令。快捷键:Ctrl P人偶工具组中有五个工具,每种工具对应一种…...