
2つの端末(/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
を読む2つのプロセスがあります/dev/pts/2
。 1つはそこで実行されるシェル(または一部のアプリケーション)で、もう1つ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
文字を読み取る。
これら2つのプログラムを実行すると、2つの端末は次のようになります/dev/pts/2
。
$ ./dead_loop
abc
d
そして/dev/pts/1
:
$ ./my_application
abc
d