Функция wait() в Ubuntu

Я изучаю процессы и их поведение в Ubuntu, но я немного запутался в wait(). Итак, мои вопросы:

  1. Как выполняется оценка while(wait(NULL)>0); работает?
  2. Какова цель NULL в wait()?

Я видел вывод в терминале, но родитель выполняет и делает детей, даже когда он выполняет функцию wait(). Разве родительское исполнение не должно быть остановлено? Вот код:

int main(int argc, char *argv[])
{
pid_t childid;

if(argc!=2)
{
    printf("Please provide an argument in terminal! \n");
    return 0;
}

int i,n=atoi(argv[1]);

for(i=0;i<n;i++)
{
    childid=fork();

    if(childid==0)
    {
        printf("Inside Child process! \n My id is %d\n",getpid());
        break; // creating fan process structure
    }
    else
        if(childid>0)
        {
            printf("Inside Parent Process! \n My id is %d\n",getpid());
        }
}

while(wait(NULL)>0); 

printf("After While Statment!\n My id is %d\n My parent ID is %d\n Child id is %d\n",getpid(),getppid(),childid);

}

Я знаю, что это очень неприятный вопрос, но так учатся люди:)

Спасибо

1 ответ

Как выполняется оценка while(wait(NULL)>0); работает?

Функция wait ожидает завершения любого дочернего процесса и, в случае успеха, возвращает идентификатор процесса завершенного дочернего процесса. Если дочернего процесса нет, возвращается -1.

В вашем коде родительский процесс в основном ожидает завершения всех потомков, которые он создал.

И для любого из детей этот вызов немедленно вернет -1, так как они не создали никакого процесса.

Какова цель NULL в wait()? Если вы видите прототип ожидания, это так,

pid_t wait(int *status);

Родительский процесс может получить статус выхода дочернего процесса в переменной status (нам нужно передать адрес целого числа в функцию ожидания, чтобы обновить это целое число), а затем макрос WEXITSTATUS, чтобы извлечь это значение.

Передача NULL (мы передаем NULL, поскольку переменная имеет тип указателя) означает, что программист не заинтересован в этом значении и уведомляет об этом в ожидании вызова.

Я немного изменил ваш код, чтобы объяснить возвращаемое значение функции ожидания и использование ненулевого аргумента. Все дочерние элементы теперь возвращают значение (индекс цикла i), которое выбирается родителем.

Pl. посмотрим, поможет ли это,

#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
  pid_t childid;
  int ret;
  int status;

 if(argc!=2)
 {
    printf("Please provide an argument in terminal! \n");
    return 0;
 }

int i,n=atoi(argv[1]);

for(i=0;i<n;i++)
{
  childid=fork();

  if(childid==0){
    printf("Inside Child process! \n My id is %d\n",getpid());
    break; // creating fan process structure
  }
  else if(childid > 0){
        printf("Inside Parent Process! \n My id is %d\n",getpid());
  }
}

//The line below, will be immediatly false for all  the children
while ((ret= wait(&status))>0)
{
  printf("After While My id is %d and my  child with pid =%d exiting with return value=%d\n" ,
  getpid(),ret, WEXITSTATUS(status));
}
//The if below will be true for the children only
if ((0 > ret) && (childid == 0)){
   printf("Child with id %d exiting and my parent's id is %d\n", getpid(), getppid());
   exit(i);
 }
else{
   printf("Parent Finally Exiting\n");
 }
}
Другие вопросы по тегам