См. Этот вопрос для объяснения того, что происходит в вашей программе: Дочерний процесс не может прочитать после выхода из родительского процесса . Самая важная часть:
Терминал управляется группой процессов переднего плана. Когда оболочка вызывает родителя, она делает родителя лидером группы процессов переднего плана. Дочерний объект наследует эту группу и имеет доступ к терминалу.
Однако, когда родитель выходит, оболочка возвращает управление терминалу и становится лидером группы процессов переднего плана. Дочерний элемент больше не входит в группу процессов переднего плана, поэтому он не имеет доступа к терминалу.
Чтобы ваша программа работала должным образом, добавьте вызов 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
следует проверять на наличие ошибок.