2010-04-27 213 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將被傳遞(帶有警報或其他幾個允許更短時間和更多控制的功能),以便您的程序可以被解除死鎖。