Проблема понять, как это работает эти процессы - PullRequest
0 голосов
/ 10 ноября 2018

Добрый вечер,

Я программирую и тестирую некоторые вещи о процессах в C с помощью системных вызовов fork () и waitpid ().Я понимаю поведение с глобальной переменной, но я не понимаю, почему, когда второй процесс завершен и обратно в первом процессе, переменная "i" имеет то же значение, что и второй процесс.

А такжепочему, когда программа возвращается к корневому процессу, переменная "i" имеет значение 2.

Вот код:

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

int total = 0;
int main(int argc, char **argv) {
    int i, pid;

    for(i = 1; i < 3; ++i) {
        pid = fork();

        if(pid == 0) {
            total = total + i;
            printf("\n");
            printf("Child process %d\n", getpid());
            printf("Parent process %d\n", getppid());
            printf("i = %d\n", i);
        } else {
            waitpid(pid, NULL, 0);
        }
    }
    printf("Child process (end) %d\n", getpid());
    printf("Parent process (end) %d\n", getppid());
    printf("total = %d\n", total);
    printf("i = %d\n", i);
    exit(0);
}

А вот результат выполнения

Child process 9191
Parent process 9190
i = 1

Child process 9192
Parent process 9191
i = 2

Child process (end) 9192
Parent process (end) 9191
total = 3
i = 3

Child process (end) 9191
Parent process (end) 9190
total = 1
i = 3

Child process 9193
Parent process 9190
i = 2

Child process (end) 9193
Parent process (end) 9190
total = 2
i = 3

Child process (end) 9190
Parent process (end) 2876
total = 0
i = 3

У меня есть предложение: функция waitpid () передает ресурсы дочернему процессу, но не может объяснить значение переменной «i» в корневом процессе.

Я надеюсь, что я был в курсе своих проблем и прошу прощения за мой маленький плохой английский.

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 10 ноября 2018

следующий исправленный код:

  1. безупречная компиляция
  2. выполняет желаемую функциональность
  3. ясно показывает, что total в родительском элементе не изменяется ребенкомобрабатывает

, и теперь, предлагаемый код:

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

int total = 0;


int main( void )   // <<-- corrected statement
{
    int i, pid;

    for(i = 1; i < 3; ++i) 
    {
        pid = fork();

        if(pid == 0) 
        {
            total = total + i;
            printf( "\n") ;
            printf( "Child process %d\n", getpid() );
            printf( "Parent process %d\n", getppid() );
            printf( "i = %d\n", i );
            exit( 0 );    // <<-- added statement
        } 

        else 
        {
            waitpid( pid, NULL, 0 );
        }
    }

    printf( "Child process (end) %d\n", getpid() );
    printf( "Parent process (end) %d\n", getppid() );
    printf( "total = %d\n", total );
    printf( "i = %d\n", i );
    exit( 0 );
}

выходной код выше:

Child process 10378
Parent process 10377
i = 1

Child process 10379
Parent process 10377
i = 2
Child process (end) 10377
Parent process (end) 10375
total = 0
i = 3

однако код не может проверитьдля случая ошибки из функции: fork(), поэтому он будет открыт для серьезного сбоя, если вызов fork() не удастся.IE код должен (также) проверять возвращаемое значение -1 из вызова на fork() и вызова

if( pid < 0 )
{
    perror( "fork failed");  
    exit( 1 );`
}
...