Функция wait() в Ubuntu
Я изучаю процессы и их поведение в Ubuntu, но я немного запутался в wait(). Итак, мои вопросы:
- Как выполняется оценка while(wait(NULL)>0); работает?
- Какова цель 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");
}
}