我打开了两个终端(/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
.一个是在那里运行的 shell(或某些应用程序),另一个是您在pts/1
.哪一个读取可用字节的速度更快是随机的。
答案2
正如@egmont所说,在终端中输入 input (在你的情况下,它是/dev/pts/2
),shell也会读取你的输入。因此,您应该阻止 shell 读取它,并且在另一个终端中运行的程序(在您的情况下是/dev/pts/1
)可以完全读取输入。
您可以启动一个简单的死循环程序,该程序根本不从 中读取输入/dev/pts/2
,这将阻止 shell 读取输入。 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