2016-12-06 4 views
4

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

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

write.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); 
} 

read.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 

ответ

4

Буфер редактирования путем чтения не является допустимым с струна так

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

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

write(fd, buf, n) != n 

потому, что вы читаете п октета read().

Это смешно, потому что вы это делаете для read.c, но не для write.c


Тип n сусле, но ssize_t и не int, man read.


main() должен возвращать intDeclare main prototype

+1

Ого, я на самом деле было это правильно в первом, но изменил его бог знает, что такое причина .. Спасибо. – mythic

 Смежные вопросы

  • Нет связанных вопросов^_^