Вы должны сделать шаг назад и сообщить нам реальные требования. Вы должны спрашивать, как добиться того, чего вы хотите, а не как этого добиться определенным образом. Делая последнее, вы ограничиваете возможности, что редко бывает разумным.
Для чего стоит, этот код будет работать под POSIX, так как только вызывающий поток приостанавливается до завершения дочернего процесса.
Если вы хотите, чтобы подпроцесс выполнялся как поток в текущем процессе, это не сработает. Вы пытаетесь смешать два разных уровня абстракции, и в тот момент, когда вы exec
, текущий процесс загружает всю новую программу. Это не повлияет на родителя (поскольку вы разветвлены), но вы не можете запустить ls
(или любую другую программу) в потоке существующего процесса.
Основано на ваших комментариях:
... because my main process has a lot of variables and stuff and I didn't want to duplicate that memory space because of the fork.
Современные операционные системы не будут дублировать все на fork
, они намного умнее этого.
Например, Linux будет только копировать таблицы страниц и создавать новую структуру задач. Вся остальная память помечена как копируемая при записи, поэтому ее можно разбивать только при необходимости.
Кроме того, в Linux есть vfork
, который даже не будет дублировать таблицы страниц, по крайней мере, до тех пор, пока вы не вызовете exec
, но родительский элемент будет приостановлен до этой точки (или _exit
), чтобы предотвратить межпроцессное повреждение и вы очень ограничены в том, что ребенку разрешено делать.