Процесс родительD создает процессы 3ребенок, A / B / C, с помощью fork.
Родительский процесс должен взаимодействовать с дочерними процессами до завершения всех дочерних процессов.
Есть ли какой-нибудь простой способ заставить родителей работать с детьми и уволить его, когда это делают дети?
Parent Process Child Process
-------------- --------------
int main(){ int main(){
// create children ...
while( all children are alive ){ for(sometime){
// ipc with children // ipc with parent
} }
return 0; return 0;
} }
Вы можете сделать это с помощью wait и waitpid.
Есть ли какой-нибудь простой способ заставить родителей работать с детьми и уволить его, когда это делают дети? да, это очень просто, все, что вам нужно сделать, это использовать fork()
для создания дочернего процесса, и каждый дочерний процесс должен отправить свой статус родительскому процессу, вызвав exit()
, а в родительском использовать waitpid()
или ждать, так что родительский процесс должен ждать всех дочерних процессов, т.е. когда дочерний элемент не существует, waitpid()
возвращает -1
.
Например, ниже приведен образец дочернего родительского кода.
int a[3]; //to store pid's of children
int main(void) {
if ( (a[0]=fork()) == 0) { /* 1st child */
int randNo;
srand(getpid());
randNo=rand()%10+1;
printf("1st_child sleep for %d sec\n",randNo);
sleep(randNo);
exit(1); /* sending the exit status to parent */
}
else {
if ( (a[1]=fork()) == 0) { /* 1nd child */
int randNo;
srand(getpid());
randNo=rand()%10+1;
printf("2nd_child sleep for %d sec\n",randNo);
sleep(randNo);
exit(2);
}
else {
if ( (a[3]=fork()) == 0) { /*1rd child */
int randNo;
srand(getpid());
randNo=rand()%10+1;
printf("3rd_child sleep for %d sec\n",randNo);
sleep(randNo);
exit(3);
}
else { /* common parent for all 3 child */
int status; //exit status of child
//signal(SIGCHLD,my_isr);
while(wait(&status) != -1) { /* when there is no child, wait() returns -1 */
if ( status>>8 == 1 ) { /* if 1st child status received */
a[0] = 0;
printf("child_1 removed from zombie \n");
}
else if ( status>>8 == 2) {
a[1] = 0;
printf("child_2 removed from zombie \n");
}
else if ( status>>8 == 3) {
a[2] = 0;
printf("child_3 removed from zombie \n");
}
}
}
}
}
return 0;
}
Также вы можете установить один signal handler
, так как когда дочерний элемент завершается, он отправляет SIGCHLD
родителю, следовательно, после получения этого сигнала родительский элемент понимает, что дочерний элемент завершен, и ему необходимо освободить ресурсы, занятые родителями.
Да, вы бы использовали
wait
(и, возможно, обработчикSIGCHLD
).