2015-09-02 2 views
-1

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

Writer.c

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

int main() 
{ 
    int fd; 
    char * myfifo = "/tmp/myfifo"; 

    /* create the FIFO (named pipe) */ 
    mkfifo(myfifo, 0666); 

    /* write "Hi" to the FIFO */ 
    fd = open(myfifo, O_WRONLY); 
    write(fd, "hi", sizeof("hi")); 
    write(fd, "4:1.jpg,2.jpg;3.jpg", sizeof("4:1.jpg,2.jpg;3.jpg")); 
    write(fd, "hi2", sizeof("hi2")); 
    write(fd, "5:1.jpg,2.jpg;3.jpg", sizeof("5:1.jpg,2.jpg;3.jpg")); 
    write(fd, "6:1.jpg,2.jpg;3.jpg", sizeof("6:1.jpg,2.jpg;3.jpg")); 
    write(fd, "7:1.jpg,2.jpg;3.jpg", sizeof("6:1.jpg,2.jpg;3.jpg")); 
    write(fd, "8:1.jpg,2.jpg;3.jpg", sizeof("6:1.jpg,2.jpg;3.jpg")); 
    write(fd, "9:1.jpg,2.jpg;3.jpg", sizeof("6:1.jpg,2.jpg;3.jpg")); 
    sleep(5); 
return 0; 

} 

Reader.c

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

#define MAX_BUF 2048 

int main() 
{ 
    int fd; 
    char * myfifo = "/tmp/myfifo"; 
    char buf[MAX_BUF]; 
    /* open, read, and display the message from the FIFO */ 
    fd = open(myfifo, O_RDONLY); 
     int i; 
     for(i =0; i < 6 ; i++) 
     { 
     int a = read(fd, buf, MAX_BUF); 
     printf("buf has : %s with size = %d \n", buf,a); 
     } 

    return 0; 
} 

Выход, как показано ниже:

buf has : hi with size = 3 
buf has : 4:1.jpg,2.jpg;3.jpg with size = 124 
buf has : 4:1.jpg,2.jpg;3.jpg with size = 0 
buf has : 4:1.jpg,2.jpg;3.jpg with size = 0 
buf has : 4:1.jpg,2.jpg;3.jpg with size = 0 
buf has : 4:1.jpg,2.jpg;3.jpg with size = 0 

Мне интересно, где пошли другие струны? Может кто-нибудь, пожалуйста, скажите мне, что случилось. Мне нужно, чтобы результат был таким, как все строки должны были проходить один за другим.

+1

124: = 4 + 5 * 24 – wildplasser

ответ

0

Вам нужно будет ждать входящих данных - когда a == 0, данных в трубе нет. После int a = ... добавить следующее:

if (a == 0) 
{ 
    i--; // repeat last iteration 
    continue; 
} 

Это хорошая идея, чтобы отправить несколько строк, а затем вы будете знать, сколько строк текста будет прибывать.

1

Звонок read возвращает все данные, которые вы написали на fifo. Ваши строки имеют длину 20 байтов (текст 19 байт и завершение \ 0). Плюс «hi2», который равен 4 байтам. И второе чтение возвращает размер 124 (6 * 20 + 4).

Fifos содержит поток данных, а не отдельные сообщения. Вы не получите успешное чтение для каждой успешной записи. Вы можете получать меньше или больше чтений, чем писать, и вам решать, как вы разрабатываете протокол, который позволяет вам отделять сообщения и буферизировать в читателе, чтобы собирать и собирать сообщения, если они распространяются по нескольким чтениям.

Причина, по которой ваш printf печатает только «первое» сообщение (сообщений нет, просто поток байтов), потому что он завершен с нулевой отметкой. Таким образом, другие строки находятся в вашем буфере, но поскольку вы печатаете весь буфер в виде строки, будет показана только первая строка в ней.

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