gcc 5 компилирует fork (), возвращает родительский pid 0? - PullRequest
0 голосов
/ 11 мая 2019

я делаю свою домашнюю работу в Linux Mint (у которой есть gcc 7.4.0), но среда тестирования домашней работы была Ubuntu 16.04 (у которой есть gcc 5.4.0)

это была работа с fork и связанный кодкак этот

pid_t pids[total_process_num], pid;
int run_process = 0;
while (run_process < total_process_num) {
    pids[run_process] = fork();
    if(pids[run_process] < 0){
        return -1;
    }
    else if(pids[run_process] == 0){
        break;      //child
    }
    else if(run_process == total_process_num){
        break;
    }
    run_process++;
}
printf("fork value and pid is %d, %ld\n", run_process,(long) pids[run_process]);

этот код печатается, если общее число процессов равно 5, чем в моей среде (если gcc 7.4 создает исполняемый файл), то результат равен

fork value and pid is 1, 0
fork value and pid is 0, 0
fork value and pid is 2, 0
fork value and pid is 5, 32766
fork value and pid is 4, 0
fork value and pid is 3, 0

в среде тестирования (если gcc 5.4сделать исполняемый файл) результат -

fork value and pid is 0, 0
fork value and pid is 1, 0
fork value and pid is 2, 0
fork value and pid is 5, 0
fork value and pid is 3, 0
fork value and pid is 4, 0

, так почему же эта разница?это из-за разницы версий gcc?я всегда думал, что fork возвращает parent к значению, отличному от 0, поскольку приведенный ниже код не работает

if (pids [run_process]! = 0) родительский процесс вводит этот оператор if в gcc 7.4, но не в 5.4.Я думаю, что gcc 5.4 - это плохо, поэтому я хочу знать причину этого результата

1 Ответ

1 голос
/ 11 мая 2019

Когда родительский элемент выполняет printf(), он печатает элемент массива, который вы никогда не назначали.

Последняя итерация цикла, присвоенная pids[4].Потомок выходит из цикла, но родитель выполняет run_process++;, поэтому run_process теперь 5.Затем условие while() завершает цикл.

Таким образом, родитель пытается вывести pids[5], но это никогда не назначалось во время цикла.Печать неназначенного значения вызывает неопределенное поведение, поэтому неудивительно, что вы получаете разные результаты от разных компиляторов.

...