Считайте числа из .txt в родительском процессе и отправьте их дочернему процессу с помощью pipe и запишите - PullRequest
0 голосов
/ 07 апреля 2020

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

Вот мой код:


#include <sys/stat.h>  
#include <sys/unistd.h>  
#include <sys/types.h>
#include <fcntl.h>  
#include <stdlib.h>  
#include <sys/wait.h>
#include <stdlib.h>
#include <signal.h>
#include <stdio.h>  
#include <errno.h>
#include <string.h>
#include <time.h>
#include <math.h>

int main()
{
    pid_t pid;
    int pip[2];
    int fd, n;
    double x1;
    double x2;

    pipe(pip);

    pid = fork();

    fd = open("numbers.txt", O_RDONLY);

    if(pid == 0)
    {
        close(pip[1]);

        read(pip[0], &x2, sizeof(double));

        printf("%lf\n", x2);

        close(pip[0]);
    }
    else
    {
        close(pip[0]);
        n = read(fd, &x1, sizeof(double));

        while(n)
        {
            write(pip[1], &x1, sizeof(double));
        }

        close(pip[1]);

        waitpid(pid, NULL, 0);
    }

    return 0;
}

Я закрываю канал когда я пытаюсь читать или писать, и другая проблема заключается в том, что он печатает 0,000000, а не фактическое значение числа.

1 Ответ

1 голос
/ 07 апреля 2020

он печатает только первый, а затем останавливается.

обратите внимание, что ребенок (пытается) только для чтения один , прежде чем уйти, так что даже вы отправили несколько только первое печатается

Doing

n = read(fd, &x1, sizeof(double));

предполагает, что numbers.txt содержит двоичное представление типа double, но из-за расширения txt Я думаю, что они содержат числа в форме ASCII, а не двоичные. Обратите внимание, что l oop, в то время как n не равно нулю, не совместимо с фактом read return -1 в EOF (не 0)

, если я изменю ваш программа для чтения их из формы ascii, и я добавляю al oop в ребенка все в порядке

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

int main()
{
    pid_t pid;
    int pip[2];
    FILE * fd;
    double x1;
    double x2;

    pipe(pip);

    pid = fork();

    fd = fopen("numbers.txt", "r");

    if(pid == 0)
    {
        close(pip[1]);

        while (read(pip[0], &x2, sizeof(double)) == sizeof(double))
          printf("%f\n", x2);

        close(pip[0]);
    }
    else
    {
        close(pip[0]);

        while (fscanf(fd, "%lf", &x1) == 1)
        {
          write(pip[1], &x1, sizeof(double));
        }

        close(pip[1]);

        waitpid(pid, NULL, 0);
    }

    return 0;
}

Компиляция и выполнение:

/tmp % gcc -Wall p.c
/tmp % cat numbers.txt 
1.2
3.14
/tmp % ./a.out
1.200000
3.140000
/tmp % 
...