2011-03-14 3 views
2

두 프로세스간에 파이프를 만드는 프로그램이 있습니다. 하나의 프로세스는 다른 프로세스의 출력을 지속적으로 모니터하고 특정 출력이 발생할 때 write() 기능을 가진 다른 파이프를 통해 입력을 제공합니다. 내가 가지고있는 문제는, 비록 파이프가 close() 파이프가 될 때까지 다른 프로세스의 표준 스트림으로 이동하지 않는다는 것입니다. 나는이 프로그램이 찾고있는 결과물을 만날 때마다 무한 루프시키고 반응하도록한다. 파이프를 닫지 않고 입력을 다른 프로세스로 보내는 방법이 있습니까?C/C++에서 동일한 파이프에 여러 번 쓰고 싶습니다.

약간 검색 한 결과 이름있는 파이프를 닫은 후 다시 열 수 있다는 것을 알았지 만 이름없는 파이프를 사용하기 위해 이미 코드를 작성 했으므로 다른 옵션이 있는지 알고 싶었습니다. 아직 배웠습니다. 명명 된 파이프를 사용합니다.

+0

첫 번째 프로세스가 파이프에 쓰는 방법은 무엇입니까? 'fprintf()'등을 사용하고 있다면 출력이 버퍼링 될 것입니다. 'fflush()'를 호출하면 데이터가 전달됩니다. –

+0

'write (pipe [1], string, strlen (string));'와 같은 줄로 파이프에 쓰고 있습니다. 'fflush()'는 유망 해 보입니다. – Alex

답변

2

어떻게 다른 쪽을 읽고 계십니까? 완전한 문자열을 기대합니까? 귀하가 올린 발췌 문장에 종결 NUL을 보내지 않았습니다. 아마도 strlen (string) +1 바이트를 보내면 문제가 해결 될 것입니다. 코드를 보지 않으면 알기가 어렵습니다.

+0

파이프의 다른 쪽 끝은 소스 코드가없는 프로그램의'stdin' 스트림으로 들어갑니다 그래서 기본적으로 파이프를 만들고 새로운 프로세스를 포크하고 하위 프로세스에서'dup2'를 사용하여 파이프를'stdin'과'stdout'에 연결합니다. 당신의 제안을 시도하고 결과, 제안 주셔서 감사합니다. – Alex

+0

정말 고마워요, 당신의 제안은 제 문제에 대한 답을 얻는 데 가장 많은 도움이되었습니다. 입력이 일종의 명령 행으로 간 것이므로 내 문제는 명령을 제출하기 위해 Enter 키를 누르는 것을 시뮬레이션하기 위해 마지막에 개행 문자를 사용하지 않고 있다는 것이 었습니다. – Alex

+0

스 니펫 (snippet)이란 무엇입니까? –

4

fflush을 사용해보십시오.    

+0

조금씩 읽고 파이프에서'fflush'를 사용할 수 있습니까? 문제는 입력이 파이프의 버퍼에 푸시 된 다음 두 번째 프로세스의 표준 입력 대신 전송된다는 것입니다. 쓰기 (pipe [1], str, strlen (str)); close (pipe [1]);'입력이 보내지지만 보낼 수있는 다른 방법을 찾지 못하는 것 같습니다. 'pipe [1]'은'integer'이고, fflush는'FILE *'을 인수로 사용합니다. 어떻게 사용하는지 모르겠습니다. – Alex

+0

@Alex : 정수를 정확하게 기억하면 정수가 파일 설명 자이며 fdopen을 사용하여 열 수 있습니다. http://stackoverflow.com/questions/650468/how-can-i-use-fprintf-and-write-to-a-pipe 파이프와 함께 fprintf와 같은 것을 사용하고 싶다면 매우 편리 할 수 ​​있습니다. – GWW

+0

나는 그것을 시험해 보았고 fdopen을 사용하여 컴파일했지만 여전히 입력을 자식 프로세스로 밀어 내지 않고있다. – Alex

1

fsync를 사용하십시오. http://www.delorie.com/gnu/docs/glibc/libc_239.html에서 http://pubs.opengroup.org/onlinepubs/007908799/xsh/fsync.html

: 일단 데이터가 기록되는 대기열에 바로 다시 읽을 수, 수익을 쓸 수 있지만 반드시 즉시 영구 저장 장치에 기록되지 않습니다. 계속하기 전에 데이터가 영구 저장되었는지 확인해야 할 때 fsync를 사용할 수 있습니다. (시스템이 연속 쓰기를 일괄 처리하고 편리 할 때 한번에 모두 수행하는 것이 더 효율적입니다. 일반적으로 항상 1 분 이내에 디스크에 기록됩니다.) 현대 시스템은 파일에 대한 무결성만을 보장하는 또 다른 기능 fdatasync를 제공합니다 따라서 데이터가 더 빠릅니다. O_FSYNC 열기 모드를 사용하여 리턴하기 전에 항상 데이터를 디스크에 저장하도록 할 수 있습니다.

+0

Fsync가 트릭을 수행하지 않은 것처럼 보입니다. – Alex

관련 문제