Как передать аргументы процессам, созданным fork() - программирование
Подтвердить что ты не робот

Как передать аргументы процессам, созданным fork()

Я хочу создать копии процесса, используя fork() в C. Я не могу понять, как передать аргументы в копии моего процесса. Например, я хочу передать целое число в копии процесса.

Или мне, что делать, если у меня есть цикл, в котором я вызываю fork(), и хочу передать уникальное значение процессам (например, 0... N)

for(int i = 0;i < 4;++i)
{
    fork();
    // pass a unique value to new processes.
}
4b9b3361

Ответ 1

Хорошая часть fork() заключается в том, что каждый процесс, который вы создаете, автоматически получает копию всего, что имеет родитель, так например, допустим, мы хотим передать int myvar каждому из двух дочерних процессов, но я хочу каждый из которых имеет другое значение от родительского процесса:

int main()
{
    int myvar = 0;
    if(fork())
        myvar = 1;
    else if(fork())
        myvar = 2;
    else
        myvar = 3;

    printf("I'm %d: myvar is %d\n", getpid(), myvar);
    return 0;
}

Таким образом, это позволяет каждому процессу иметь "копию" myvar с его собственным значением.

I'm 8517: myvar is 1
I'm 8518: myvar is 2
I'm 8521: myvar is 3

Если вы не изменили значение, то каждый процесс fork'd будет иметь такое же значение.

Ответ 2

Локальные и глобальные переменные по сути сохраняются на уровне fork(), поэтому нет необходимости "передавать аргументы". Если вы вызываете функцию в разветвленном процессе, вы можете сделать что-то вроде:

pid_t pid = fork();
if (pid == 0) {
    funcToCallInChild(argument);
    exit(0);
}

Ответ 3

Я опаздываю, чтобы ответить, но вот как я это делаю:

const char *progname = "./yourProgName";
const char *argument1 = "arg1";
const char *argument2 = "arg2";

if (fork() == 0)
{
    // We are the child process, so replace the process with a new executable.  
    execl(progname, progname, argument1, argument2, (char *)NULL);
}
//  The parent process continues from here.

Сначала вы используете fork() для создания нового процесса. Он по-прежнему имеет то же пространство памяти, что и прежнее. fork() возвращает как родительский, так и дочерний процессы. Если fork() возвращает ноль, вы являетесь дочерним процессом. Затем дочерний процесс использует execl() для замены памяти процесса одним из нового файла.

Обратите внимание, что progname присваивается дважды execl(). Первое - это то, что execl() будет пытаться запустить, второе - argv [0]. Вы должны указать оба параметра, или количество аргументов будет отключено на единицу. Progname должен содержать всю необходимую информацию о пути, чтобы найти желаемое исполняемое изображение.

Я приведу два аргумента в этом примере, но вы можете передать столько, сколько хотите. он должен быть завершен с помощью NULL, и я думаю, что вы должны использовать его как (char *), как я показываю.

Этот подход дает вам полностью независимый процесс с аргументами и уникальным pid. Он может продолжать работать задолго до завершения родительского процесса или может завершиться до родителя.

Ответ 4

Смотрите exec() семейство функций.

EDIT: если вы пытаетесь инициализировать копии той же самой программы, что и базовый процесс, просто продолжайте использовать переменные, предложенные duskwuff.

Ответ 5

Вы можете использовать clone() (который фактически используется самим fork()). Он позволяет передавать аргумент в вашу функцию ввода.

http://linux.die.net/man/2/clone