# Why no \`fork()\` in \`std::process\`?

**URL:** <https://internals.rust-lang.org/t/why-no-fork-in-std-process/13770>\
**Category:** libs\
**Created:** [January 7, 2021, 3:04pm UTC](https://internals.rust-lang.org/t/why-no-fork-in-std-process/13770 "2021-01-07T15:04:21Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![ckaran](https://avatars.discourse-cdn.com/v4/letter/c/f475e1/32.png) [@ckaran](https://internals.rust-lang.org/u/ckaran)\
**Post date:** [January 7, 2021, 3:04pm UTC](https://internals.rust-lang.org/t/why-no-fork-in-std-process/13770/1 "2021-01-07T15:04:21Z")

</div>

The discussion at [Pre-RFC overhaul Command for 2021 ed](https://internals.rust-lang.org/t/pre-rfc-overhaul-command-for-2021-ed/13755) made me think of a question that's been bugging me for a while now; why isn't there a `fork()` function in [`std::process`](https://doc.rust-lang.org/std/process/index.html)? I know that there has to be a good reason, but I have no idea what it is...

---

<div class="post-metadata">

**Author:** ![chrisd](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/chrisd/32/7232_2.png) [@chrisd](https://internals.rust-lang.org/u/chrisd)\
**Post date:** [January 7, 2021, 3:24pm UTC](https://internals.rust-lang.org/t/why-no-fork-in-std-process/13770/2 "2021-01-07T15:24:53Z")

</div>

It's OS specific and it seems potentially very unsafe, particularly in multi-threaded programs. See [fork(2)](https://man7.org/linux/man-pages/man2/fork.2.html) and [signal-safety(7)](https://man7.org/linux/man-pages/man7/signal-safety.7.html).

---

<div class="post-metadata">

**Author:** ![ckaran](https://avatars.discourse-cdn.com/v4/letter/c/f475e1/32.png) [@ckaran](https://internals.rust-lang.org/u/ckaran)\
**Post date:** [January 7, 2021, 3:51pm UTC](https://internals.rust-lang.org/t/why-no-fork-in-std-process/13770/3 "2021-01-07T15:51:42Z")

</div>

@chrisd Thank you for the quick reply.

I see what you mean now, I didn't realize it was such a problem.

---

<div class="post-metadata">

**Author:** ![RalfJung](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/ralfjung/32/2415_2.png) [@RalfJung](https://internals.rust-lang.org/u/RalfJung)\
**Post date:** [January 7, 2021, 6:52pm UTC](https://internals.rust-lang.org/t/why-no-fork-in-std-process/13770/4 "2021-01-07T18:52:20Z")

</div>

Also see the discussion around `before_exec`, which was a safe way to execute code in the forked process, and was deprecated in favor of an `unsafe` function:

> <https://github.com/rust-lang/rust/issues/39575>
>
> The before\_exec method should be marked unsafe because after a fork from a multi-threaded process, POSIX allows only allows async-signal-safe functions...

---

<div class="post-metadata">

**Author:** ![jethrogb](https://avatars.discourse-cdn.com/v4/letter/j/43a26b/32.png) [@jethrogb](https://internals.rust-lang.org/u/jethrogb)\
**Post date:** [January 8, 2021, 4:53pm UTC](https://internals.rust-lang.org/t/why-no-fork-in-std-process/13770/5 "2021-01-08T16:53:50Z")

</div>

See also [https://www.microsoft.com/en-us/research/uploads/prod/2019/04/fork-hotos19.pdf](https://www.microsoft.com/en-us/research/uploads/prod/2019/04/fork-hotos19.pdf)

---

<div class="post-metadata">

**Author:** ![josh](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/josh/32/5934_2.png) [@josh](https://internals.rust-lang.org/u/josh)\
**Post date:** [January 8, 2021, 9:15pm UTC](https://internals.rust-lang.org/t/why-no-fork-in-std-process/13770/6 "2021-01-08T21:15:54Z")

</div>

Also, you can easily call `libc::fork()`, if `pre_exec` isn't sufficient for your use case.

---

<div class="post-metadata">

**Author:** ![ckaran](https://avatars.discourse-cdn.com/v4/letter/c/f475e1/32.png) [@ckaran](https://internals.rust-lang.org/u/ckaran)\
**Post date:** [January 8, 2021, 9:22pm UTC](https://internals.rust-lang.org/t/why-no-fork-in-std-process/13770/7 "2021-01-08T21:22:28Z")

</div>

No, no particular use case at this time; I didn't mean to imply that it should be added, I knew that this group would have already considered it, and so the fact that it wasn't available was for a good reason. I just didn't know what that reason was. Now I do. Thank you all for clarifying the situation for me.

---

<div class="post-metadata">

**Author:** ![system](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/system/32/14092_2.png) [@system](https://internals.rust-lang.org/u/system)\
**Post date:** [April 8, 2021, 9:22pm UTC](https://internals.rust-lang.org/t/why-no-fork-in-std-process/13770/8 "2021-04-08T21:22:32Z")

</div>

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.
