# fork() without execve()

`fork()` is a way to make a clone of a process. Most subprocesses replace the child process with a new executable, wiping out all memory from the parent process. A `fork()ed` subprocess can choose not to do this, and preserve data from the parent process. (Technically this is `fork()` without `execve()`.)

This is a terrible idea, as it can cause deadlocks, memory corruption, and crashes.

For backwards compatibility, Eventlet tries to work in this case, but this is very much not guaranteed and your program may suffer from deadlocks, memory corruption, and crashes. This is even more so when using the `asyncio` hub, as that requires even more questionable interventions to “work”.

This is not a problem with Eventlet. It’s a fundamental problem with `fork()` applicable to pretty much every Python program.

Below are some common reasons you might be using `fork()` without knowing it, and what you can do about it.

## `multiprocessing`

On Linux, on Python 3.13 earlier, the standard library `multiprocessing` library uses `fork()` by default. To fix this, switch to the `"spawn"` method (the default in Python 3.14 and later) as documented here <https://docs.python.org/3.13/library/multiprocessing.html#contexts-and-start-methods>.

## `oslo.service`

There are alternative ways of running services that do not use `fork()`. See the documentation.