Нежелательные значения после дочернего процесса scanf - PullRequest
0 голосов
/ 12 февраля 2020
Оператор

my scanf в дочернем процессе не работает должным образом:

int main(int argc, char **argv)
{
    int operando, operatore;

    pid2 = fork();
    if (pid2 == 0) { // Figlio 2

        printf("Inserisci due numeri: ");

        scanf("%d%d", &operando, &operatore); //even though I " %d%d"...

        printf("Operando is %d and operatore is %d\n", operando, operatore);

    }


    return 0;
}

Это вывод: error

  • How исправить?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Не удалось позвонить на scanf(). Код мог бы знать это, если бы проверил возвращаемое значение scanf(). Любое возвращаемое значение, отличное от 2., будет указывать на возникшую ошибку.

Ошибка scan () в первом спецификаторе «преобразования входного формата», поэтому он никогда не смотрел на второй спецификатор «преобразования входного формата».

Когда целочисленный спецификатор «преобразования входного формата» в вызове scanf() завершается неудачно, целевая переменная устанавливается равной 0. Вторая переменная отображает что когда-либо тра sh было в памяти в его месте в стеке.

0 голосов
/ 12 февраля 2020

См. Этот вопрос для объяснения того, что происходит в вашей программе: Дочерний процесс не может прочитать после выхода из родительского процесса . Самая важная часть:

Терминал управляется группой процессов переднего плана. Когда оболочка вызывает родителя, она делает родителя лидером группы процессов переднего плана. Дочерний объект наследует эту группу и имеет доступ к терминалу.

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

Чтобы ваша программа работала должным образом, добавьте вызов wait в родительский процесс, чтобы родительский процесс не завершается, пока дочерний процесс не завершится, и, таким образом, терминал останется доступным для дочернего процесса.

Например:

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

int main(int argc, char **argv)
{
    int operando, operatore;

    pid_t pid2 = fork();

    if (pid2 == 0) { // Figlio 2
        printf("Inserisci due numeri: ");    
        scanf("%d%d", &operando, &operatore); //even though I " %d%d"...    
        printf("Operando is %d and operatore is %d\n", operando, operatore);
    } else if (pid2 > 0) {
        wait(NULL);
    }

    return 0;
}

Обратите внимание на некоторые другие общие улучшения, которые следует учитывать:

  • Всегда проверяйте возвращаемое значение вызовов функций. В частности, scanf следует проверить перед использованием результатов в printf. Аналогично, возвращаемое значение fork следует проверять на наличие ошибок.
...