Родительский процесс работает до завершения дочерних процессов

Процесс родитель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 (и, возможно, обработчик SIGCHLD).

melpomene 13.09.2018 18:42

Вы можете сделать это с помощью wait и waitpid.

Ali Hussam 13.09.2018 20:13
0
2
483
1

Ответы 1

Есть ли какой-нибудь простой способ заставить родителей работать с детьми и уволить его, когда это делают дети? да, это очень просто, все, что вам нужно сделать, это использовать 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 родителю, следовательно, после получения этого сигнала родительский элемент понимает, что дочерний элемент завершен, и ему необходимо освободить ресурсы, занятые родителями.

Другие вопросы по теме