\n
다음 코드가 주어지면 cat은 왜 CTRL+를 입력한 후에만 파이프의 내용을 인쇄 합니까 D? 고양이가 읽은 내용을 실제로 인쇄하려면 어떤 조건이 필요합니까?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void){
int pid,p[2];
char ch;
pipe(p);
if((pid=fork()) == -1){
fprintf(stderr,"Error:can't create a child!\n");
exit(2);
}
if(pid){
close(p[0]);
while((ch=getchar())!=EOF){
write(p[1],&ch,1);
}
close(p[1]);
wait(0);
}else{
close(p[1]);
close(0);
dup(p[0]);
close(p[0]);
execlp("cat","cat",NULL);
}
return 0;
}
답변1
cat
이는 파이프나 버퍼링과 관련이 없습니다. 귀하의 "문제"는 최종 장치의 업스트림입니다.
터미널 키보드에 입력하는 모든 문자를 응용 프로그램에서 즉시 읽을 수 있는 경우 을 cat
입력하면 aBackspacebReturn응용 프로그램이 다음으로 읽습니다 . a
이는 ^?
원하는 바가 아니며 얻을 수 있는 것도 아닙니다.b
^M
당신이 원하고 얻는 것은 그것을 읽는 것뿐입니다 a^J
.
기본적으로 이것을 얻습니다.모델모드, 터미널 장치 드라이버(tty 라인 규율)는라인 편집기텍스트를 입력하고 편집할 수 있습니다(제한된 기능). 입력한 텍스트는 을 누를 때만 읽을 수 있습니다 Return.
이를 방지하려면 최종 장치에 이 설정을 유지하도록 지시할 수 있습니다.모델모델. 예를 들어 를 실행하면 stty raw
애플리케이션이 표시되고 cat
문자가 즉시 표시되지만 동작은 예상한 것과 다를 수 있습니다.
또한 다른 유형의 입력(예: 파이프)의 경우 문자가 도착하자마자 다음과 같이 출력된다는 점도 알 수 있습니다.
(printf x; sleep 1; echo y) | that-command
답변2
다음 주기를 따르세요.
while((ch=getchar())!=EOF)
{
write(p[1],&ch,1);
}
그리고:
char carriageReturn = 0x0D;
write( p[1], &carriageReturn, 1 );