파일 설명자에 EOF를 발행하는 방법(열린 상태로 유지)?

파일 설명자에 EOF를 발행하는 방법(열린 상태로 유지)?

터미널에서 +를 누르는 것과 Ctrl유사한 동작을 달성하기 위해 내 프로그램에서 어떤 코드를 호출할 수 있습니까? D즉, readSTDIN에서 호출된 함수가 하위 프로세스에서 반환되도록 0하고 상위 프로세스에서 이 "STDIN" 파일 설명자를 닫지 않으려면?

EOF 조건이 Linux의 프로세스에 어떻게 전달되는지 이해하려고 합니다.

read반환은 단지 권고일 뿐인 것으로 보이며 0실제로 이러한 EOF 상황이 발생한 후에도 계속해서 읽을 수 있습니다. 다음 프로그램을 고려해보세요:

#include <unistd.h>
#include <stdio.h>

void terminate_buf(char *buf, ssize_t len)
{
    if(len > 0) {
        buf[len-1] = '\0';
    } else {
        buf[0] = '\0';
    }
}

int main()
{
    int r;
    char buf[1024];

    while(1) {
        r = read(0, buf, 1024);
        terminate_buf(buf, r);
        printf("read %d bytes: %s\n", r, buf);
    }

    return 0;
}

프로그램을 컴파일하고( gcc -o reader reader.creader.c라고 가정) 터미널에서 프로그램을 실행한 다음 Ctrl+를 누르고 DEnter를 누르면 foobarEnter다음과 같은 내용이 표시됩니다.

$ ./reader 
read 0 bytes: 
foobar
read 7 bytes: foobar


EOF 이벤트 후에 의미 있는 데이터를 읽는 것이 전적으로 가능함을 보여줍니다. 한 줄에서 +를 여러 번 누른 Ctrl다음 일부 텍스트를 누르고 아무 일도 일어나지 않은 것처럼 계속 데이터를 읽을 수 있습니다(+를 누를 때마다 "read 0 bytes:"가 인쇄됨). 파일 설명자는 열린 상태로 유지됩니다.DreaderCtrlD

그렇다면 여기서 무슨 일이 일어나고 있으며 이 동작을 어떻게 복제할 수 있습니까? EOF를 본 후 하위 프로세스가 일부 데이터를 보도록 만드는 방법은 무엇입니까? 일반 파일 I/O(또는 s)를 사용하여 ioctl이를 수행할 수 있는 방법이 있습니까? 아니면 pty를 열어야 합니까? 횟수가 0인 통화는 write작동하지 않는 것 같으며 read상대방이 응답하지도 않습니다. 무엇정말요?

답변1

Ctrl-D(0x04)는 터미널 장치에 의해 EOF에 매핑됩니다. 파이프나 파일에서 읽는 경우에는 이런 일이 발생하지 않습니다.

echo -e "a\x04b" | cat

또는

echo -e "a\x04b" | hd

예를 들어 파이프라인의 첫 번째 프로그램이 터미널에서 데이터를 읽는 중이고 매핑된 EOF를 무시하려는 경우 터미널 동작을 변경할 수 있습니다.

stty eof -

그리고 Ctrl-D는 더 이상 작동하지 않습니다. 또는 다음을 통해 전체 선 규칙을 변경할 수 있습니다.

stty raw

파일처럼 읽을 수 있으며 변환이 필요하지 않습니다.

EOF 문자가 포함되어 있지 않은 한 EOF 문자를 사용하여 여러 파일을 보낼 수 있습니다. 한 사람이 그것을 할 것입니다.

그러나 MIME 멀티파트, zmodem 또는 파이프에 아카이브와 같은 확립된 솔루션을 사용하는 것이 더 나을 수도 있습니다(예를 들어, 여기서 두 번째 것은 tar첫 번째 아카이브의 파일을 나열합니다: ) tar cf - *txt | tar tf -.

답변2

문제는 실제로 "EOF 조건"과 같은 것이 없다는 것입니다. 관례적으로 0을 반환하는 읽기는 파일 끝으로 해석되지만 보시다시피 계속해서 읽을 수 있습니다. 추가 읽기는 다시 0을 반환할 수 있으며, 다른 프로세스가 동시에 파일에 쓰는 경우 더 많은 데이터를 반환할 수 있습니다.

터미널의 신호 에도 Ctrl-D특별한 "EOF" 신호 속성이 없습니다. 실제로 수행하는 작업은 Enter 키를 누르는 것과 같지만 개행 문자를 추가하지 않고 현재 입력 줄을 프로세스에 반환하는 것입니다. 줄(즉, 빈 줄)의 첫 번째 입력으로 Ctrl-D를 누르면 0개의 문자가 반환되며 이는 다시 관례에 따라 "EOF"로 해석됩니다.

읽기의 반환 값 0이 해석되는 방식은 읽기 시스템 호출을 호출하는 프로세스에 의해 결정됩니다.

관련 정보