2010-04-27 7 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 도메인 소켓은 FIFO보다 설정 (소켓 생성, 초기화 및 연결)에 약간의 오버 헤드가 필요하지만 더 유연하며 양방향 통신을 제공합니다.

0

또 다른 옵션은 psudo-terminal (ptty)을 사용하는 것입니다. UNIX 소켓보다 높은 오버 헤드가 있지만 작동 할 TCP 소켓을 사용할 수도 있습니다.

교착 상태가 발생할 수 있으므로 양방향 파이프가 자주 사용되지 않습니다 (prog1은 prog2의 데이터를 기다리고있는 prog1의 데이터를 기다리고있는 prog2의 데이터를 기다리고 있지만 ...). 대안은 또한 각 측이 대화에서 역할을 할 때 SMTP (단순 메일 전송 프로토콜)와 같이 일반적으로 사용되는 프로토콜에서 발생할 수 있습니다.

교착 상태가 발생할 수 있다고 생각되면 적어도 한 쪽에서 폴링, 선택, pselect 및 epoll_ *을 포함한 폴링 기능 중 하나를 사용하여 타임 아웃을 설정하거나, 프로그램이 교착 상태에서 빠져 나올 수 있도록 SIGALM이 전달되도록 (알람이나 짧은 시간과 더 많은 제어를 허용하는 몇 가지 다른 함수를 사용).