두 개의 터미널(/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