Как писать и читать из именованного канала в языке Си?


У меня есть 2 программы (пишу.В и читать.с). Я хочу непрерывно писать в именованный канал со стандартного входа и читать с него на другом конце (и записывать в стандартный выход). Я кое-что сделал, но это работает неправильно. Программа на другом конце читает в неправильном порядке или читает специальные символы (так что она читает больше, чем нужно?). Я также хочу иметь возможность сравнить выходные данные именованного канала с определенной строкой.

В любом случае, вот код от обоих файлы:

Пишите.c:

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

#define BUFFSIZE 512
#define err(mess) { fprintf(stderr,"Error: %s.", mess); exit(1); }

void main()
{
    int fd, n;

    char buf[BUFFSIZE];


    mkfifo("fifo_x", 0666);
    if ( (fd = open("fifo_x", O_WRONLY)) < 0)
        err("open")

    while( (n = read(STDIN_FILENO, buf, BUFFSIZE) ) > 0) {
        if ( write(fd, buf, strlen(buf)) != strlen(buf)) { 
            err("write");
        }
    }
    close(fd);
}

Читайте.c:

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

#define BUFFSIZE 512
#define err(mess) { fprintf(stderr,"Error: %s.", mess); exit(1); }

void main()
{
    int fd, n;
    char buf[BUFFSIZE];

    if ( (fd = open("fifo_x", O_RDONLY)) < 0)
        err("open")


    while( (n = read(fd, buf, BUFFSIZE) ) > 0) {

        if ( write(STDOUT_FILENO, buf, n) != n) { 
            exit(1);
        }
    }
    close(fd);
}

Пример ввода:

hello how are you
123 
test

Пример неправильного вывода:

hello how are you
b123
o how are you
btest
 how are you
b

Другой пример ввода:

test
hi

И вывод:

test
hi
t
1 5

1 ответ:

Буфер modify by read не является допустимой строкой c, поэтому

write(fd, buf, strlen(buf)) != strlen(buf) // write.c

- неопределенное поведение. Вы должны сделать

write(fd, buf, n) != n

Потому что Вы читаете N октетов с read().

Это забавно, потому что вы делаете это для чтения.c, но не для записи.c


Тип n должен, но ssize_t и не int, человек читал .


main() должен вернуть a int объявить главный прототип