양방향 기능은 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"의 위대한 전통을 매우 많이 따르므로 입력 스트림의 끝을 인식하고 입력 파이프를 닫지 않고 응답을 시작할 수 있습니다.