다른 터미널에서 데이터를 읽는 방법은 무엇입니까?

다른 터미널에서 데이터를 읽는 방법은 무엇입니까?

두 개의 터미널(/dev/pts/1 및 /dev/pts/2)을 열고 /dev/pts/1에서 애플리케이션을 시작했습니다. /dev/pts/2에서 실시간으로 읽고 싶지만 코드가 작동하지 않습니다. 실제로 일부 기호는 /dev/pts/1에 표시되고 일부 기호는 /dev/pts/2에 표시됩니다.

FILE *f = fopen("dev/pts/2", "r");
while(1) {
    char current = fgetc(f);
    printf("%c", current);
    fflush(0);
}

답변1

를 읽는 두 개의 프로세스가 있습니다 /dev/pts/2. 하나는 거기에서 실행되는 셸(또는 일부 응용 프로그램)이고 다른 pts/1하나는 사용 가능한 바이트를 더 빨리 읽는 것입니다.

답변2

@egmont가 말했듯이 터미널에 input을 입력하면(귀하의 경우에는 /dev/pts/2) 쉘이 입력 내용도 읽습니다. 따라서 쉘이 이를 읽지 못하도록 해야 하며, 다른 터미널(귀하의 경우 /dev/pts/1)에서 실행 중인 프로그램은 입력을 완전히 읽을 수 있습니다.

입력을 전혀 읽지 않는 간단한 무한 루프 프로그램을 시작할 수 있습니다. /dev/pts/2그러면 쉘이 입력을 읽지 못하게 됩니다. C의 전체 소스 코드는 아래와 같이 간단하며 예, 필요하지도 않습니다.#include<stdio.h>

int main(){
    while(1);
}

그런 다음 에서 애플리케이션을 시작할 수 있습니다 /dev/pts/1. 소스 코드의 주요 부분은 사용자가 제공하며 전체 소스 코드는 다음과 같습니다.

#include<stdio.h>

int main(){
    FILE* fp=fopen("/dev/pts/2","r");
    while(1){
        char c=fgetc(fp);
        if(c==-1)break;
        fputc(c,stdout);
    }
    return 0;
}

무한 루프를 시작해야 합니다.앞으로다른 프로그램도 다음에서 입력해야 합니다./dev/pts/2 무한 루프 프로그램이 실행 중일 때. 또한 누를 때만 Enter응용 프로그램이 /dev/pts/1입력을 받고 newline문자를 읽습니다.

이 두 프로그램을 실행하면 두 터미널은 다음과 같습니다 /dev/pts/2.

$ ./dead_loop
abc
d

그리고 /dev/pts/1:

$ ./my_application
abc
d

관련 정보