2016-09-26 4 views
0

Я создал процесс, который имеет 3 детей. Проблема в том, что я не могу создать ни одного из этих детей, не убивая его в конце, когда fork()==0. Мой код, как:Как убить дерево детей родительского процесса

for(i=0 ; i<3 ; i++){ 
    if(fork()==0){ 
    //do child things 
    exit(0); 
    } 
    else{ 
    //do parent things 
    } 
} 

Я хотел бы создать эти 3 детей, не убивая их, и, когда они будут созданы, убить их всех.

PS: К сожалению о моем английском :)

+2

Hm. Кто заставляет вас убивать их? –

+0

Не знаете, в чем проблема. Но разговоры об убийстве детей звучат как плохая идея (каким бы способом). – Olaf

+0

@Olaf Создание их зомби не намного лучше :) –

ответ

0

Вы должны следить за ИЗОДРОМНЫЕ каждый ребенок. Затем в конце цикла вы получите kill.

pid_t child_pid[3]; 
for(i=0 ; i<3 ; i++){ 
    child_pid[i] == fork(); 
    if (child_pid[i]==-1){ 
     perror("fork failed"); 
     exit(0); 
    } else if (child_pid[i]==0){ 
    //do child things 
    exit(0); 
    } 
    else{ 
    //do parent things 
    } 
} 
for(i=0 ; i<3 ; i++){ 
    kill(child_pid[i], SIGKILL); 
}  
0

Проблема заключается в том, что я не могу создать любой из этих детей, не убивая его в конце

Единственное, что я вижу в вашем примере кода, который я могу соотнести с «убийством «Дети - это их призывы к exit(). Однако я бы не стал называть это «убийством» их; каждый ребенок просто заканчивается обычно, когда он выполняет exit() в конце своей работы.

Кроме того, ничто не заставляет вас иметь детей exit() в этой точке. Если они не выходят, они просто продолжаются из блока if. Если вы не хотите, чтобы они раскошеливали своих детей, тогда вы можете поставить break вместо exit(), чтобы они вырвались из окружающего цикла.

Это вызывает вопрос о том, имеет ли смысл делать это. Если на самом деле не существует какой-либо работы, подходящей для выполнения детьми после выхода из цикла, если они звонят exit(), как они это делают сейчас, это правильная вещь.

В любом случае, если вы действительно хотите принудительно убить дочерние процессы, а не разрешать им нормально завершаться, то @dbush демонстрирует, как вы это сделаете. Возможно, однако, вы предпочли бы для родителя подождать после цикла, пока все дети не закончится самостоятельно. В этом случае вместо вызова kill(), который демонстрирует @dbush, вы можете позвонить waitpid(). Заметьте также, что если вы вручную убиваете детей, то потом вы должны также ждать их. Только если вы хотите, чтобы дети продолжали работать независимо, если вы не дождались их.

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