Как писать и читать из именованного канала в языке Си?
У меня есть 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 ответ:
Буфер 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()
должен вернуть aint
объявить главный прототип