2009-03-20 7 views
0

나는 제공된 파일의 내용을 취하여 처리하고 stdout을 통해 결과를 화면에 출력하는 바이너리 프로그램 *을 가지고있다. 자동화 스크립트의 경우이 프로그램에 데이터를 보내고 출력을 직접 처리하기 위해 명명 된 파이프를 사용하고 싶습니다. 스크립트를 작동 시키려고 시도한 후에는 명명 된 파이프에서 데이터를 받아들이는 바이너리 프로그램에 문제가 있음을 깨달았습니다. 이 문제를 설명하기 위해 유닉스 쉘을 사용하는 몇 가지 테스트를 설명했다.명명 된 파이프의 문제를 어떻게 해결합니까?

  1. 실제 데이터 파일을 처리하여 프로그램이 작동한다는 것을 보여주기 쉽습니다.

    $ binprog file.txt > output.txt 
    

    이렇게하면 file.txt에서 처리 된 정보가 포함 된 output.txt가됩니다.

  2. 명명 된 파이프 (pipe.txt)는이 데모 에서처럼 작동합니다.

    $ cat pipe.txt > output.txt 
    $ cat file.txt > pipe.txt 
    

    이렇게하면 파이프를 통해 보낸 후에 file.txt의 데이터가 포함 된 output.txt가 생성됩니다.

  3. 이진 프로그램이 파일 대신 명명 된 파이프에서 읽는 경우 올바르게 작동하지 않습니다.

    $ binprog pipe.txt > output.txt 
    $ cat file.txt > pipe.txt 
    

    이 경우 output.txt에는 cat 및 binprog이 종료 된 후에도 데이터가 없습니다. top과 ps를 사용하면 binprog이 "실행 중"이고 겉으로보기에 일을하고있는 것을 볼 수 있습니다. 모든 것은 오류없이 실행됩니다.

왜이 세 번째 예제에서 binprog에 의해 생성 된 출력이 없습니까?

내가이 작업을 수행하려고 시도 할 수있는 것은 무엇입니까?

[*] 문제의 프로그램은 libsvm에서 svm-scale입니다. 나는 그들을 깨끗하고 단순하게 유지하기 위해 예를 일반화하기로 선택했다.

+0

명명 된 파이프에 쓰기를 시작하기 전에 binprog를 시작하면 binprog read()가 "file"(pipe.txt)을 읽을 때 작동 오류 코드와 상관없이 0 바이트가 출력 될 수 있습니다 , 그냥 나간다. binprog 전에 cat을 실행하면 어떻게됩니까? –

+0

Antti.huima, 파이프를 먼저 파이프에 넣고, binprog 프로세스를 시작하는 과정을 시도해 보았습니다. 아무런 차이가 없습니다. 똑같은 일이 발생합니다. – Nixuz

+0

백그라운드에서 'cat pipe.txt> output.txt'를 실행하지 않아도됩니까? 'binprog'와 비슷하게? –

답변

1

binprog도 표준 입력을 허용합니까? 그렇다면이 방법이 도움이 될 수 있습니다.

cat pipe.txt | binprog > output.txt 
cat file.txt > pipe.txt 

편집 : 짧게는 SVM 규모의 맨 페이지를 검색합니다. 대신이 소용돌이를주십시오 :

cat pipe.txt | svm-scale - > output.txt 
+0

아니요 표준 입력의 입력을 허용하지 않습니다. 내 설명서 페이지에 아무 것도 없었으므로 어쨌든 시도했지만 작동하지 않습니다. – Nixuz

3

프로그램이 파이프와 함께 작동합니까? 입력 파일에 대한 임의 액세스가 필요한 경우 작동하지 않습니다. 입력 파일에서 찾기를 시도 할 때마다 프로그램에 오류가 발생합니다.

프로그램이 파이프에 대해 작동하도록 설계되었고 bash를 사용하고 있다면 프로세스 대체를 사용하여 명시 적으로 명명 된 파이프를 작성하지 않아도됩니다. binprog 만약

binprog <(cat file.txt) > output.txt 
+0

파이프로 작업해야하며 실행 후에도 오류가 발생하지 않으며 충돌이 발생하지 않는다고 확신합니다. 대체 아이디어는 흥미 롭지 만 궁극적으로 제 스크립트에는 효과가 없습니다. – Nixuz

+0

랜덤 액세스가 단말기에서 너무 잘 작동하지 않습니다. –

0

가 입력으로 터미널 이외의 잘 작동하지 않는, 어쩌면 당신은 그것을 입력에 대한 (사이비) 단자 (PTY)를 제공해야합니다. 조직하기가 더 어렵지만, 프로그램을 비교적 쉽게 수행 할 수있는 방법 중 하나는 expect입니다. w Richard Stevens와 Stephen A Rago가 Advanced Programming in the Unix Environment, 3rd Edn에 pty로 프로그래밍하고 Marc J Rochkind가 Advanced Unix Programming, 2nd Edn으로 프로그래밍에 대해 논의했습니다.

다른 결과는 truss 또는 strace 또는 해당 지역의 동일한 출력입니다. 이 프로그램은 프로세스가 작성한 모든 시스템 호출을 기록합니다. 솔라리스에서는 다음을 실행했습니다 :

truss -o binprog.truss binprog 

대화 형으로 실행합니다. 그런 다음 I/O 리디렉션으로 시도한 다음 명명 된 파이프에서 I/O 리디렉션으로 시도합니다. 그것이하는 일과 시스템 콜이 걸려있는 것을 볼 때 상당한 차이가있을 수 있습니다. 트러스 로그 파일에서 분기가 보이면 어린이를 따라 가기 위해 '-f'플래그를 추가해야합니다.