양방향 팝픈 사용

양방향 팝픈 사용

양방향 기능은 FreeBSD 2.2.6에 추가되었으며 popen()MacOS에서 사용할 수 있습니다. 나는 줄 바꿈으로 구분된 문자열 스트림을 작성하는 C 프로그램을 가지고 있으며 이를 내가 작성한 Perl 도구로 파이프할 수 있기를 원합니다.목록STDIN에서 이러한 스트림을 읽고 버퍼링한 후 수직으로 정렬된 다중 열 형식으로 STDOUT에 씁니다.

C 프로그램에서는 다음을 사용합니다.

FILE *cols_pipe = popen("cols", "r+");파이프를 열고 시작하세요목록;

fprintf( cols_pipe, "%s\n", word );줄 바꿈으로 끝나는 각 단어를 열로 보냅니다.

while ((getline(&line_buf, &line_buf_len, cols_pipe)) != -1) {
     printf("%s", line_buf);
}

다시 읽고 형식이 변경된 줄을 인쇄합니다.목록. 프로그램이 중단되었을 때 getline()나는 그 이유를 깨달았습니다.목록STDIN에서 EOF가 수신되지 않았지만 닫힙니다.상장관리(EOF를 보내기 위해 제가 생각할 수 있는 유일한 방법) 다시 읽는 것을 방지할 수 있습니다.

확실히,목록모든 입력을 읽을 때까지 출력 쓰기를 시작할 수 없습니다.

이를 달성하는 방법에 대한 제안이 있으십니까? C 프로그램은 대화형이므로 단순히 명령줄에서 호출하고 STDOUT을 파이프로 연결하고 싶지 않습니다.목록.

답변1

Perl 프로그램(작성된 대로)은 STDIN에서 EOF를 요구하고 이를 달성하는 유일한 방법은 입력 파이프를 닫는 것이므로 이는 적용되지 않습니다 popen(). 그러나 Perl 코드가 있으므로 A를 정의하는 명령 옵션을 추가하는 것을 고려할 수 있습니다. "입력 끝"을 나타내는 특수 마커는 "heredocs"의 위대한 전통을 매우 많이 따르므로 입력 스트림의 끝을 인식하고 입력 파이프를 닫지 않고 응답을 시작할 수 있습니다.

관련 정보