gpt4 book ai didi

c - 当我调用 vfork() 时,我可以调用任何 exec*() 函数,还是必须调用 execve()?

转载 作者:IT王子 更新时间:2023-10-29 00:51:21 28 4
gpt4 key购买 nike

From the Linux man page :

The vfork() function has the same effect as fork(2), except that the behavior is undefined if the process [...] calls any other function before successfully calling [...] one of the exec(3) family of functions.

这表明在 vfork() 之后调用任何 exec*() 函数是可以接受的。但是,在手册页的后面,它明确指出:

In particular, the programmer cannot rely on the parent remaining blocked until the child [...] calls execve(2) [...].

execve(2) 在手册页中重复使用,其用法表明它是 vfork( )

那么为什么要在这里单独列出 execve,我调用其他 exec 类型的函数(如 execlp)是否安全?

最佳答案

您必须调用execve。无法保证任何其他 exec 系列函数不会执行在 vfork 之后不安全的操作。例如:

  • execl 可以为参数列表分配内存。它需要异步信号安全,这意味着它不太可能使用 malloc,但即使不使用,它也无法释放分配的内存(存在于父内存空间中) ) 在底层 execve 发生之后,因此它(最多)会泄漏父级中的内存,除非它设法在堆栈上构造参数列表。

  • execvp 需要访问环境以执行路径搜索,还需要构造连接的路径名以传递给 execve。后者可能需要分配,而前者可能会在 vfork 之后做各种不安全的事情(注意:execvp 甚至不是异步信号安全的)。

等等

真的,你不应该使用 vfork。几乎不可能保证其使用安全。特别是它在任何使用信号处理程序的程序中都是不安全的,因为信号处理程序可以在子进程中运行,同时它共享父进程的内存,除非你阻止所有信号(在这种情况下,子进程将在 exec 之后继承一个完全阻塞的信号掩码,这几乎肯定不是你想要的)。

如果您正在寻找一种比 fork 更高效的替代方法,请使用 posix_spawn

关于c - 当我调用 vfork() 时,我可以调用任何 exec*() 函数,还是必须调用 execve()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24223014/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com