2014-03-28 2 views
2

나는 두 개의 기능을 가지고있다 작가()독자(). writer() 함수에서 파이프에 메시지를 쓰고 reader() 함수에서 읽는 중입니다. 내가 직면하고있는 문제는 메시지가 파이프에 쓰여지고 있지만 읽을 수 없다는 것입니다. 어쩌면 독서를 위해 파이프를 여는 데 문제가있을 수 있습니다. 코드는 다음과 같습니다 :리눅스에서 파이프 사이의 통신

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

using namespace std; 

//edit 
int fifo = mkfifo("/tmp/mypipe", S_IWUSR | S_IRUSR | S_IRGRP | S_IROTH); 

void writer() 
{ 
    char message[] = "this is a message"; 
    int fd; 
    fd = open("pipe" , O_WRONLY); 
    write(fd , message , sizeof(message)); 
    cout<<"message wrote: "<<message<<"\n";  // gives output 
}            // message wrote: this is a message 

void reader() 
{ 
    char buffer[100]; 
    int fd; 
    fd = open("pipe" , O_RDONLY); 
    read(fd , buffer , 100); 
    cout<<"message is: "<<buffer<<"\n";  // gives output 
}           // message is: 

int main() 
{ 
    writer(); 
    reader(); 
    return 0; 
} 

디버깅했습니다. 그리고 나는 fifo가 올바르게 작성되지 않았다고 생각합니다. 이 문제를 해결하는 방법을 모르겠습니다. 도움이 더 필요합니다.

enter image description here

어떤 도움 주셔서 감사합니다.

+0

writer/reader를 호출하기 전에 main 메서드에서 fifo를 만듭니다. –

+0

main()에서 fifo를 만들려고 시도했는데 출력을 보냈습니다 : message wrote : 이것은 메시지 메시지입니다 : – user2831683

+0

main()에서 fifo를 만든 후 미안 해요, 나는 리더/라이터 함수에서 fifo의 이름을 변경하지 않았습니다. , 지금 바뀌었고, 그것은 훌륭하게 작동했습니다. 도와 줘서 고마워. – user2831683

답변

3

내 생각 엔 파이프를 올바른 방법으로 만들지 않았을 것입니다. mkfifo man page을 살펴보십시오. umask 값은 umask man page을 참조하십시오.

mkfifo("/tmp/pipe", 0666)과 같은 내용으로, 먼저 /tmp/pipe을 리더/라이터에 엽니 다.

는 또한 fifo man page에서 살펴 :

커널은 적어도 하나 개의 프로세스에 의해 열릴 때마다 FIFO 특수 파일에 대한 하나 개의 파이프 객체를 유지한다. FIFO는 양쪽 끝 (읽기 및 쓰기)에서 으로 열어야 데이터를 전달할 수 있습니다. 일반적으로 다른 쪽 끝이 열릴 때까지 FIFO 블록을 엽니 다.

이제 문제는 독자가 파일을 열 때까지 open(..., O_WRONLY)이 차단된다는 것입니다.

사용을 시도하려면 독자 만 실행 한 다음 echo "test" > /tmp/pipe을 사용하십시오.

업데이트 :

또는 사용 스레드, 난 그냥 그것을 밖으로 시도했다. -std=c++0x 및 링커에 다음 라이브러리를 추가 :

int main() { 
    mkfifo(fifo_name.c_str(), 0666); 
    std::thread w(writer);  
    std::thread r(reader); 
    w.join(); 
    r.join(); 
    unlink(fifo_name.c_str()); 
    return 0; 
} 

당신은 또한 #include <thread>에 있고,이 컴파일러 플래그를 추가 -lpthread을.

+0

나는 FIFO를 만들었지 만 이제 터미널에는 출력이 없다. 이것이 내가 FIFO를 생성 한 방법입니다. int res = mkfifo ("/ tmp/mypipe", 0666); ' – user2831683

+0

@ user2831683, 답변을 업데이트했습니다. –

+0

나는이 질문을 편집했다. – user2831683

1

이것은 명명 된 파이프가 posix에서 어떻게 작동하는지에 관한 것입니다. 이미 누군가가 있다면, 그 사람에게 글을 쓸 수 있습니다. 아무 것도 없으면 누군가가 읽을 때까지 write() 작업이 차단됩니다. 당신은 내가/O

  • 당신은 리더와 다른 프로세스 (스레드)에서 작가를 구현 블로킹을 사용하고 작가 이전에 독자라고

    1. 경우

      가장 간단한 해결책은이었다.

  • 2

    문제가 무엇인지 알 수 있으므로 함수 호출의 반환을 확인하십시오.

    errno를 포함합니다.시간 :

    #include <errno.h> 
    #include <string.h> 
    

    그리고 것은 개방 시도 당신이 당신의 쓰기에서 오류 수익을 얻을 때의 errno를 확인하거나 읽기 : 당신, 그래서 다른 답변 상태로

    fd = open("pipe" , O_WRONLY); 
    if (fd < 0) 
    { 
        cout << "writer open failed: " << errno << "(" << strerror(errno) << ")\n"; 
        /* exit */ 
    } 
    

    , 당신은)에서는 mkfifo를 (사용하지 않는 '를 (O_CREAT와 mode 인수를 제공하지 않으면 실패 할 수도있는) 전형적인 파일을 만든다.