고양이는 언제 파이프에서 데이터 읽기를 마칩니까?

고양이는 언제 파이프에서 데이터 읽기를 마칩니까?

\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 );

관련 정보