나는 제공된 파일의 내용을 취하여 처리하고 stdout을 통해 결과를 화면에 출력하는 바이너리 프로그램 *을 가지고있다. 자동화 스크립트의 경우이 프로그램에 데이터를 보내고 출력을 직접 처리하기 위해 명명 된 파이프를 사용하고 싶습니다. 스크립트를 작동 시키려고 시도한 후에는 명명 된 파이프에서 데이터를 받아들이는 바이너리 프로그램에 문제가 있음을 깨달았습니다. 이 문제를 설명하기 위해 유닉스 쉘을 사용하는 몇 가지 테스트를 설명했다.명명 된 파이프의 문제를 어떻게 해결합니까?
실제 데이터 파일을 처리하여 프로그램이 작동한다는 것을 보여주기 쉽습니다.
$ binprog file.txt > output.txt
이렇게하면 file.txt에서 처리 된 정보가 포함 된 output.txt가됩니다.
명명 된 파이프 (pipe.txt)는이 데모 에서처럼 작동합니다.
$ cat pipe.txt > output.txt $ cat file.txt > pipe.txt
이렇게하면 파이프를 통해 보낸 후에 file.txt의 데이터가 포함 된 output.txt가 생성됩니다.
이진 프로그램이 파일 대신 명명 된 파이프에서 읽는 경우 올바르게 작동하지 않습니다.
$ binprog pipe.txt > output.txt $ cat file.txt > pipe.txt
이 경우 output.txt에는 cat 및 binprog이 종료 된 후에도 데이터가 없습니다. top과 ps를 사용하면 binprog이 "실행 중"이고 겉으로보기에 일을하고있는 것을 볼 수 있습니다. 모든 것은 오류없이 실행됩니다.
왜이 세 번째 예제에서 binprog에 의해 생성 된 출력이 없습니까?
내가이 작업을 수행하려고 시도 할 수있는 것은 무엇입니까?
[*] 문제의 프로그램은 libsvm에서 svm-scale입니다. 나는 그들을 깨끗하고 단순하게 유지하기 위해 예를 일반화하기로 선택했다.
명명 된 파이프에 쓰기를 시작하기 전에 binprog를 시작하면 binprog read()가 "file"(pipe.txt)을 읽을 때 작동 오류 코드와 상관없이 0 바이트가 출력 될 수 있습니다 , 그냥 나간다. binprog 전에 cat을 실행하면 어떻게됩니까? –
Antti.huima, 파이프를 먼저 파이프에 넣고, binprog 프로세스를 시작하는 과정을 시도해 보았습니다. 아무런 차이가 없습니다. 똑같은 일이 발생합니다. – Nixuz
백그라운드에서 'cat pipe.txt> output.txt'를 실행하지 않아도됩니까? 'binprog'와 비슷하게? –