2013-09-27 4 views
0

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

Вот то, что я до сих пор:

for(int i = 0; i < processes; i++) 
{ 
    pid = fork(); 
    printf("%d\n", pid); 
} 

if(pid < 0) 
{ 
perror("fork"); 
exit(-1); 

} 

else if(pid == 0) 
{ 

    /*for(int j = 0; j <= 5; j++) 
    { 
     execl("~/cs370/PA2/gambler.c","run", NULL); 
     Gamble(percent); 
    }*/ 

} 

Так быть ясно снова. Я хочу, чтобы спал "processes" количество детей, что все звонят "gambler.c". Но ТОЛЬКО 5 может работать одновременно. Он должен wait(), а затем обрабатывать остальных детей по 5 за раз.

Ввод пробы:

run -p 60 10

Где -p представляет собой процент, подаваемого в gambler.c, который просто возвращает успех или неудачу на основе генератора случайных чисел. 60 - процент. 10 - количество процессов.

Любая помощь очень благодарна спасибо!

ответ

1

Вы изучали семью exec? Exec будет порождать процессы. Затем вы можете использовать wait для контроля процессов. fork предоставит вам PID, и тогда вы можете получить вторую петлю потока по каждому вызову pid wait и отслеживать каждый активный процесс.

wait man page

exec man page

pid_t pid = fork() 
if (pID == 0) 
{ 
    //child 
    //immediatly call whichever exec you need. Do not do anything else. 
    //do not log a message or print a string. Any calls to c++ standard strings 
    //will risk deadlocking you. 
} 
else if (pid < 0) 
{ 
    //error 
} 
else 
{ 
    //parent. store pid for monitoring 
} 
+0

При использовании EXEC, мне нужно, чтобы установить 'PID = вилка()', как я сделал выше? Или exec автоматически создаст все эти процессы, которые мне нужны? – Necrode

+0

Exec заменяет текущее пространство процесса. Так что вам все равно нужно развить. – mjr

+0

Дух ... Я забыл XP. Хорошо. Поэтому я называю fork один раз, а не в цикле. Однако, если я вызову exec в цикле, он будет давать новые pids каждый раз? Или он будет спамить одно и то же «х» количество раз? – Necrode

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