2012-06-21 1 views
0

stdin으로 리디렉션을 사용하여 명명 된 파이프를 통해 간헐적으로 보낸 데이터를 읽을 수 있습니까? 다른 터미널에서stdin으로 리디렉션을 사용하여 명명 된 파이프를 통해 간헐적으로 보낸 데이터를 읽을 수 있습니까?

$ mkfifo pipe 
$ ./test < pipe 

:

는 내가 뭘하고 싶은 것은 이것이다

$ cat datafile > pipe 
$ cat datafile > pipe 

파이프에 정보를 덤핑 반복. 이것은 처음으로 작동합니다. 무엇을

그래서
int main(int argc, char *argv[]) { 
    char input_string[30]; 
    while(1) { 
     while(cin.read(input_string, 30) || cin.gcount()!=0) { 
      cout << "!" << endl; 
     } 
    } 
return 1; 
} 

일이야 :

다음 동작을 보여줍니다 테스트를위한 데모 프로그램입니까? 리다이렉션은 단일 전송 내용 만 파이프에 제공합니까? 필자는 파이프의 이름을 매개 변수로 사용하는이 프로덕션 코드의 버전을 작성했으며이 방법으로 작성하기 위해 열어 두었습니다. 아마도 그 대답 일 수 있습니다. 그러나 리디렉션을 통해이를 수행 할 수있는 방법이 있는지 궁금합니다.

답변

1

는이 같은 파이프에서 입력을 리디렉션하는 경우 :

./test < pipe 

쉘은 읽기 파이프를 열고 다음 프로그램을 시작합니다. 그러나 파이프를 열면 작가가 존재할 때까지 완료되지 않습니다. 즉, open(2) 블록입니다. 다른 프로세스가 쓰기 위해 파이프를 열면 원래 open 호출이 완료되고 두 프로세스가 통신 할 수 있습니다. 작성자가 파이프의 끝을 닫으면 판독 끝도 닫히고 판독기는 EOF를 얻습니다.

주기가 완료되면 판독을 위해 파이프를 다시 열 수 있고 다른주기를 시작할 수 있지만 직접 수행해야합니다. 따라서 stdin을 읽는다면 프로그램을 다시 시작해야합니다. 또는, 당신은 단지

// Error checking omitted for expository purposes 
int main(int argc, char **argv) 
{ 
    while(1) 
    { 
     int fd = open("pipe", O_RDONLY); 
     char buffer[30]; 
     int n; 
     while((n = read(fd, buffer, sizeof(buffer)) > 0) 
     { 
      // Process input 
     } 
     close(fd); 
    } 

    return 0; 
} 

당신이 표준 입출력 FILE*에서 원시 I/O를 포장하려면

, 당신은 fdopen(3)을 사용할 수있는 다른 파일 기술자, 예컨대 :에 파이프를 다시 열 수 있습니다; 가능할 수도 있지만 C++ 스트림 객체에 파일 설명자를 래핑하는 방법을 알지 못합니다.

0
$ cat datafile > pipe 

은 데이터 파일의 내용을 파이프에 보내고 EOF (파일 끝)를 보냅니다. 이 시점에서 리디렉션이 닫히고 파이프에 푸시 된 데이터는 더 이상 ./test으로 리디렉션되지 않습니다.

관련 문제