Проблема с разнонаправленной трубой (папа <-> сын) - PullRequest
0 голосов
/ 05 сентября 2018

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

Запись в s2f [1] возвращает -1, но я не понимаю, почему.

Вы можете мне помочь? Есть что-нибудь еще, что не работает или что я мог бы улучшить?

/*
Write a program in C language that in sequence:
1) create 2 pipes and a child (the 2 pipes will be used for two-way communication between the parent
and son);
2) the father, after the creation of the child, takes in input from the user a file name;
3) send the child the name of the file using the first pipe;
4) make the child look for the number of spaces in the file and communicate this number to the father through the use of the second pipe;
5) let the father print the number received from son;
*/

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

int main (int argc, char *argv[])
{
    int f2s[2]; 
    int s2f[2];
    int fd, n;
    pid_t p;
    char buf[20];
    char c;
    int countspace=0, valueofspace;
    if (argc<2)
    {
        printf("ERROR!\n");
        exit (-1);
    }
    if (pipe (f2s) == -1 && pipe (s2f) == -1)
        exit(-1);
    p=fork();
    if (p>0)
    {
        printf("I'm inside the father process.\n");
        close(f2s[0]);
        close(s2f[1]);
        write(f2s[1],argv[1],sizeof(argv[1]));

        read(s2f[0],&valueofspace, sizeof(int));
        printf("The spaces are %d", valueofspace);      
        printf("Father exit\n");
        exit(0);
    }
    if (p==0)
    {
        printf("I'm inside the child process.\n");
        close(f2s[1]);
        close(s2f[0]);
        read (f2s[0],buf,20);

        if (fd = open(buf, O_RDONLY) == -1)
            printf("Error when opening the file\n");

        while (read(fd,&c,1) > 0)
        {
            if (c==' ')
                countspace++;
        }
        close(fd);
        printf("Count: %d\n",countspace);
        n = write(s2f[1],&countspace, sizeof(countspace));
        printf("WRITE of %d BYTES\n", n);
        printf("Son exit \n");
        exit(0);
    }
}

1 Ответ

0 голосов
/ 05 сентября 2018

Вы закрыли конец чтения канала s2f перед записью в него.

close(s2f[0]);

Так что при записи в канал будет ошибка EPIPE. Из онлайн ссылки на write (с дополнительным акцентом):

Ошибка EPIPE возникает, когда fd подключен к трубе или сокету, конец чтения которого закрыт . Когда это происходит, процесс записи также получит сигнал SIGPIPE. ( Таким образом, возвращаемое значение записи отображается только в том случае, если программа перехватывает, блокирует или игнорирует этот сигнал .)

Поскольку ваша программа не перехватывает, не блокирует и не игнорирует этот сигнал, возвращаемое значение записи не соответствует ожидаемому и равно -1.

...