Использование Scanf() в дочернем процессе, выполняемом через execv, не работает

Я выполняю очень простую программу, которая принимает целое число от пользователя с помощью scanf. Я выполняю эту программу как дочернюю программу через fork() и execv. Дочерняя программа никогда не принимает данные от пользователя. Любая помощь будет оценена по достоинству.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    pid_t childpid;

    if((childpid = fork()) == -1)
    {
        perror("fork");
        exit(1);
    }

    if(childpid == 0)
    {
        execv("child",NULL);
        exit(1);
    }
    else  
    {
        printf("Parent process is terminating...\n");
        return 0;
    }
}

и дочерний код

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int temp;
    printf("This is Child Process. Child is going to sleep for 5 seconds\n");
    sleep(5);
    printf("Please enter an integer to terminate the process ");
    scanf("%d",&temp);
    printf("You entered %d ",temp);
    printf("Child terminated");
    return 0;
}

ВЫХОД

[@localhost cascading]$ ./cascading 
Parent process is terminating...
[@localhost cascading]$ This is Child Process. Child is going to sleep for 5 seconds
Please enter an integer to terminate the process You entered 12435[@localhost cascading]$ ^C
[@localhost cascading]$ 

Я запускаю код в Fedora, установленном на виртуальной машине. Спасибо.


person user3422997    schedule 15.03.2014    source источник


Ответы (2)


После завершения родительского процесса управление возвращается оболочке; и stdin может быть закрыт.

Чтобы сохранить доступ ребенка к stdin, вы можете позволить родителю подождать, пока ребенок не закончит.

Итак, в вашем родителе:

else {
    printf("Parent process is terminating...\n");
    wait(NULL);
    return 0;
}
person Arjun Sreedharan    schedule 15.03.2014
comment
На самом деле я написал этот код, чтобы показать, как Fedora не поддерживает каскадное завершение, показав, что дочерний процесс может выполняться без родителя. - person user3422997; 16.03.2014

Вам нужно дождаться завершения дочернего процесса, пожалуйста, измените свой код следующим образом

if(childpid == 0)
{
    execv("child",NULL);
    exit(1);
}
else
{
    wait(); //wait for child
    printf("Parent process is terminating...\n");
    return 0;
}
person Rahul R Dhobi    schedule 15.03.2014