简介
在上几篇中,基本是都是通过函数参数传递的方式进行的参数传递,本篇中使用Linux的管道优化参数传递
源码说明
同时放到了Gitee和Github上,都可进行获取
本章节对应的版本标签是:3.3,防止后面代码过多,不好查看,可切换到标签版本进行查看
在上几篇中,都是通过函数传递的方式获取的参数,但在书中说:用户输入的参数过长,或者其中带有一些特殊字符,那参数的获取就会有些问题
本篇中使用管道进行优化,这个管道有点类似于go中的channel和Java中的阻塞队列,可以写入和读取
当写满时,写进程就会阻塞,直到有读进程把管道的内容读出来
但读取时,如果管道为空,同样会被阻塞,一直等到有写进程忘里面写数据
编码实现
代码没有前面的多了,比较少了,主要为:
- 管道的创建
- 参数数据的写入
- 参数数据的读取
1.管道的创建
首先是在fork进程启动的时候,创建出管道。写管道返回,用于写入数据;读管道作为文件句柄,传入新进程中
func NewParentProcess(tty bool) (*exec.Cmd, *os.File) {
// 生成管道
readPipe, writePipe, err := os.Pipe()
if err != nil {
log.Errorf("create pipe error: %v", err)
return nil, nil
}
cmd := exec.Command("/proc/self/exe", "init")
cmd.SysProcAttr = &syscall.SysProcAttr{
Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS | syscall.CLONE_NEWNET | syscall.CLONE_NEWIPC,
}
if tty {
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
}
// 将管道的一端传入fork的进程中
cmd.ExtraFiles = []*os