Это действительно зависит от того, что вы пытаетесь сделать, именно так:
- ОС зависит
- Не совсем понятно, что вы пытаетесь сделать.
Тем не менее, я постараюсь предоставить вам некоторую информацию для принятия решения.
В UNIX fork()
создает клон вашего процесса из того места, где вы назвали fork. Смысл, если у меня следующий процесс:
#include <unistd.h>
#include <stdio.h>
int main()
{
printf( "hi 2 u\n" );
int mypid = fork();
if( 0 == mypid )
printf( "lol child\n" );
else
printf( "lol parent\n" );
return( 0 );
}
Вывод будет выглядеть следующим образом:
привет 2 u
лол ребенок
лол родитель
Когда вы fork()
, pid, возвращаемый в потомке, равен 0, а pid, возвращаемый в родительском элементе, - это pid ребенка. Обратите внимание, что "hi2u" печатается только один раз ... родителем .
execve()
и его семейство функций почти всегда используются с fork().
execve()
и т. П. Перезаписывают текущий стековый фрейм именем приложения, которое вы передаете ему. execve()
почти всегда используется с fork()
, когда вы разветвляете дочерний процесс, и если вы родитель, вы делаете все, что вам нужно, а если вы - ребенок, вы запускаете новый процесс. execve()
также почти всегда используется с waitpid()
- waitpid берет pid дочернего процесса и, буквально, ждет , пока ребенок не завершит работу, и вернет вам статус выхода ребенка.
Используя эту информацию, вы сможете написать очень простую оболочку; тот, который принимает имена процессов в командной строке и запускает процессы, которые вы ему сообщаете. Конечно, оболочки делают больше, чем, например, ввод и вывод по трубопроводам, но вы должны быть в состоянии выполнить основы, используя fork()
, execve()
и waitpid()
.
ПРИМЕЧАНИЕ. Это * * nix! Это НЕ будет работать в Windows.
Надеюсь, это помогло.