2014-12-14 5 views
0

Как создать несколько дочерних процессов из командной строки?C - Создание дочерних процессов

Что-то вроде этого, где п задается из командной строки:

for (i = 0; i < n; i++) { 
      pids[i] = fork(); 
} 
+1

C не знает о процессах. 'fork' не стандартизирован в C99 или C11, а в POSIX. Вероятно, вам не хватает Linux или POSIX-тега. –

+2

. Посмотрите man-страницу функций, которые вы используете (http://linux.die.net/man/3/fork). Особенно разделы _Description_ и _Return Value_ содержат ценную информацию часто. Особенно, когда вы не знаете, что делает функция. – moooeeeep

+0

Цикл for должен быть написан так, что только один из родителей выполняет fork(), иначе ребенок выполняет тот же цикл, поэтому (более или менее) бесконечное число детей и детей детей и детей детей детей ... процессы генерироваться. Посмотрите код возврата fork(), чтобы избежать того, чтобы дети также использовали fork() собственных детей. – user3629249

ответ

6

Нет, это не будет работать, потому что тогда дочерние процессы будут создавать больше детей, и это не будет то, что вы хотели. Чтобы лучше понять, как это происходит, взгляните на fork() branches more than expected?. Таким образом, вы должны выйти из цикла, если текущий процесс является как ребенок так:

for (i = 0; i < n; i++) { 
    if (!(pid[i] = fork())) 
     break; 
} 

Для того, чтобы увидеть это в действии, давайте посмотрим на минимально полный пример

file.c :

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) { 
    int i, n = atoi(argv[1]); 
    pid_t *pid = calloc(n, sizeof *pid); 
    for (i = 0; i < n; i++) 
     if (!(pid[i] = fork())) 
      break; 

    puts("hello world"); 

    return 0; 
} 

Затем скомпилировать и запустить его

$ gcc -o file file.c 
$ ./file 3 
hello world 
hello world 
hello world 
hello world 

Обратите внимание, что есть 4 сообщения, потому что есть 3 ребенка плюс родительский процесс.

+0

Вопрос состоял в том, как я могу выполнить этот код из командной строки, указав 'n' – Angelo

+0

@Angelo Ah, поэтому вы заинтересованы главным образом в том, как использовать терминал для его запуска. Я был смущен вашими тегами. В этом случае я отредактирую пример того, как это сделать. – randomusername

+0

Спасибо. А также, почему это создало бы больше детей с моим кодом? создает ли n дочерних элементов? Я не понимаю. – Angelo

Смежные вопросы