2010-04-27 199 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

FIFO的往往是单向的。如果你想要一个FIFO你既可以读取又可以写入,那么你真正想要的可能是一对FIFO(每个方向一个)或者一个UNIX套接字。

3

FIFO(也称为命名管道)提供了单向进程间通信通道。 FIFO具有读取结束和写入结束。写入FIFO的写入端的数据可以从FIFO的读取端读取。由于它们是单向的,双向通信需要一对FIFO。

由于cHao suggested,另一种选择是使用Unix套接字。 Unix域套接字比FIFO设置(套接字创建,初始化和连接)需要更多的开销,但更灵活并提供双向通信。

0

另一种选择是使用psudo终端(ptty)。您也可以使用TCP套接字,其开销比UNIX套接字更高,但可以工作。

由于死锁的可能性(prog1正在等待来自prog2的数据,它正在等待来自prog1的数据,它正在等待来自prog2的数据...),因此往往不鼓励双向管道,但这可以发生在任何解决方法也是如此,并且可以使用SMTP(简单邮件传输协议)等常用协议,因为每方都在对话中发挥作用。

如果您认为可能发生死锁,您可能希望至少有一方有超时,您可以通过其中一个轮询函数(包括poll,select,pselect和epoll_ *)来执行该操作,或者通过排列SIGALM将被传递(带有警报或其他几个允许更短时间和更多控制的功能),以便您的程序可以被解除死锁。