Golang Go语言中 process.Release() 的作用究竟是什么

发布于 1周前 作者 eggper 来自 Go语言

初学 go ,最近在阅读 wireguard-go 的代码,看到其 daemonize 相关的代码,其中有如下代码段(去掉无关代码):

		path, err := os.Executable()
		if err != nil {
			fmt.Printf("Failed to determine executable: %v\n", err)
			os.Exit(-1)
		}
	process, err := os.StartProcess(
		path,
		os.Args,
		attr,
	)
	if err != nil {
		fmt.Printf("Failed to daemonize: %v\n", err)
		os.Exit(-1)
	}
	fmt.Printf("chile process pid is %v\n", process.Pid)

	err = process.Release()
	if err != nil {
		fmt.Printf("release process failed %v\n", err)
	}

其中 process.Release() 究竟 Release 了什么,注释中提到的是:"Release releases any resources associated with the Process p, rendering it unusable in the future." ,这其中resources 指的是什么?

github中也有相关的 Issues ,提到“ I've sent the PR that specifying Release's NOOP behavior on Unix.” 其中 "NOOP" 是什么意思? NO operation 什么都不做吗?

我简单试验了一下,如果父进程执行完创建进程后立刻退出了,不管是否进行 Release , 子进程都会被托管给 launchd 进程。

而如果父进程没有立即退出,进行了 Release ,这时候子进程的父进程就是创建他的进程如果子进程先退出,此时子进程就会变成一个僵尸进程。不进行 Release 的结果也是一样的。

我感到非常的混乱,Release 感觉像是什么都没有做一样,不知道我的感觉是否正确?


Golang Go语言中 process.Release() 的作用究竟是什么

更多关于Golang Go语言中 process.Release() 的作用究竟是什么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

没写过 go ,不过大概猜测 Release 是回收子进程,防止僵尸进程的出现。建议看看僵尸进程的相关文章。

更多关于Golang Go语言中 process.Release() 的作用究竟是什么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢您的回复,我起初也是觉得 Release 是防止出现僵尸进程的,但我测试了下 不管有没有 Release ,子进程退出以后都会变成僵尸进程,如 91566 。

bash<br>91563 ttys000 0:00.01 ./main -t<br>91566 ttys000 0:00.00 &lt;defunct&gt;<br>

在 Windows 下会关闭 Process Handle

用完就释放是个好习惯。

你不能假定底层会做什么,但起码你可以把你能做的都给做了。

哪怕底层现在是 NOOP ,后期也可能会更改(况且还要考虑到跨平台),为了保证代码的可靠性,最好从一开始就把能做的都给做了,这样能避免很多问题。

在任何语言都是这样的。

有 gc 的话尽量(不是全部,那不是你应该做的)减少 gc 的工作,来优化性能,gc 适用的是普遍环境,某些特殊情况下 gc 做的优化可能并不咋地。

没有 gc 的话只能自己处理,总不能全在进程退出的时候由系统处理吧?

结合您和 回复的内容,我的理解是在 Windows 下会关闭 process handle ,但是在 unix 下该函数其实什么也不做,为了良好的编程习惯以及潜在的跨平台可能,通常还是要有该代码。

#4 C 语言入门的程序员可能会有这习惯,写好 malloc 就去在合适的地方放个 free 。从自带 gc 语言入门的,这方面意识可能不强,或者得是到后期考虑到优化和防漏才会逐步加强吧。

我一般会开个 goroutine 调用 Wait() 让子进程退出后自动释放资源。

#6

是的,个人觉得不带 gc 的语言更能培养开发中的好习惯。

gc 终究不能胜任所有情况,有些时候保持这种好习惯能避免很多麻烦事。

unix 下没有任何用,就是简单的把 pid 设置成了-1 ,然后清理了一下 Finalizer ,并且你不调用这个方法这个对象在 gc 回收的时候也会调用这个 Release

在Golang(Go语言)中,process.Release() 并不是一个内置函数或方法,因此它可能是来自某个特定的第三方库或用户自定义的函数。不过,基于命名习惯,我们可以推测这个函数可能用于释放与某个进程相关的资源。

在标准库中,处理进程相关的操作通常涉及到 os/exec 包,但该包中并没有 Release() 方法。因此,如果 process.Release() 出现在你的代码中,它可能是以下几种情况之一:

  1. 第三方库:某些第三方库可能提供了对进程管理的封装,其中可能包括 Release() 方法来释放资源。这种情况下,你需要查阅该库的文档来了解具体作用。

  2. 用户自定义:如果这个函数是用户自定义的,那么它的作用完全取决于实现细节。它可能用于关闭文件描述符、释放内存、解除锁等。

  3. 伪代码或示例:在某些教学材料或示例代码中,process.Release() 可能被用作占位符,表示释放进程资源的操作,而具体实现需要开发者根据上下文来补充。

总之,要准确了解 process.Release() 的作用,你需要查看它所在的库的文档或源代码。如果这个函数是自定义的,那么你需要理解它的实现逻辑。在没有更多上下文的情况下,无法给出一个确切的答案。

回到顶部