2010-04-27 3 views
2

Я хотел бы реализовать двунаправленный fifo. Код ниже работает, но он не использует двунаправленный fifo. Я искал по всему Интернету, но не нашел хорошего примера ...Двунаправленный FIFO

Как я могу это сделать?

Спасибо,

WRITER.c:

#include <stdio.h> 

#include <unistd.h> 

#include <string.h> 

#include <sys/types.h> 

#include <sys/wait.h> 
#include <fcntl.h> 



#define MAXLINE 4096 

#define READ 0 

#define WRITE 1 


int main (int argc, char** argv) 
{ 
int a, b, fd; 

do { 
    fd=open("/tmp/myfifo",O_WRONLY); 
    if (fd==-1) sleep(1); 
    } while (fd==-1); 

    while (1) { 
    scanf("%d", &a); 
    scanf("%d", &b); 

    write(fd,&a,sizeof(int)); 
    write(fd,&b,sizeof(int)); 

    if (a == 0 && b == 0) 
    { 
    break; 
    } 

    } 

    close(fd); 
    return 0; 
} 

READER.c:

#include <stdio.h> 

#include <unistd.h> 

#include <string.h> 

#include <sys/types.h> 

#include <sys/wait.h> 
#include <fcntl.h> 
#include <sys/stat.h> 




#define MAXLINE 4096 

#define READ 0 

#define WRITE 1 



int main(void) 

{ 
    int n1, n2; 
    int fd; 

    mkfifo("/tmp/myfifo",0660); 
    fd=open("/tmp/myfifo",O_RDONLY); 

    while(read(fd, &n1, sizeof(int))) 
    { 
read(fd, &n2, sizeof(int)); 

if (n1 == 0 && n2 == 0) 
{ 
    break; 
} 

printf("soma: %d\n",n1+n2); 

    printf("diferenca: %d\n", n1-n2); 

    printf("divisao: %f\n", n1/(double)n2); 

    printf("multiplicacao: %d\n", n1*n2); 
    } 

    close(fd); 

    return 0; 
} 

ответ

10

FIFOs, как правило, один из способов. Если вам нужен FIFO, с которым вы можете читать и писать, скорее всего, это то, что вы действительно хотите - это пара FIFO (по одному в каждом направлении) или UNIX-сокет.

3

FIFO (также известный как именованный канал) обеспечивают однонаправленный канал межпроцессного обмена. FIFO имеет считываемый конец и конец записи. Данные, записанные на конец записи FIFO, могут быть считаны со считываемого конца FIFO. Поскольку они являются однонаправленными, для двунаправленной связи требуется пара FIFO.

Как cHao suggested, другой вариант - использовать гнездо Unix. Сокеты домена Unix требуют немного больших затрат на установку (создание сокетов, инициализацию и подключение), чем FIFO, но более гибкие и предлагают двунаправленную связь.

0

Другой вариант - использовать psudo-терминал (ptty). Вы также можете использовать сокеты TCP, которые имеют более высокие накладные расходы, чем сокеты UNIX, но будут работать.

Двунаправленные трубы часто обескуражены из-за возможности взаимоблокировки (prog1 ожидает данные от prog2, которые ждут данные из prog1, которые ждут данные от prog2 ...), но это может произойти с любым из обходные пути, а также могут встречаться с обычно используемыми протоколами, такими как SMTP (простой почтовый транспортный протокол), поскольку каждая сторона играет роль в разговоре.

Если вы считаете, что может возникнуть взаимоблокировка, вы можете захотеть, чтобы хотя бы одна сторона имела тайм-аут, который вы можете выполнить с помощью одной из функций опроса (включая опрос, выбор, выборку и epoll_ *) или путем организации для доставки SIGALM (с сигналом тревоги или несколькими другими функциями, которые позволяют сократить время и больше контроля), чтобы ваша программа могла выйти из тупика.

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