大家好我在伪终端/dev/pts/1
上运行以下代码,我正在尝试从终端/dev/pts/2
读取内容。
#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
int main(){
char str[50];
int fd = open("/dev/pts/2",O_RDONLY);
str[read(fd,str,20)] = '\0';
printf("%s\n",str);
return 0;
}
anirudh@anirudh-Aspire-5920:~$ gcc test.c
anirudh@anirudh-Aspire-5920:~$ ./a.out
n
anirudh@anirudh-Aspire-5920:~$
在终端/dev/pts/2
上我输入了“anirudh”但是它显示了“airudh”,并且终端n
上显示了丢失的字符/dev/pts/1
。
但是,当我尝试从终端/dev/pts/1
读取时,我可以正确阅读每个角色。
所以我无法理解这个程序的行为。请帮帮我。提前致谢。 :)
答案 0 :(得分:1)
首先,你可能有另一个进程从/ dev / pts / 2读取,因此字符被发送到它而不是你的。然后终端可能被其他进程设置为“char per char”模式(这就是某些shell所做的),你只读一个字符。
答案 1 :(得分:0)
哇。首先,这是一个很好的规则:检查返回给你的系统调用。 Alaways。
int main(){
char str[50];
int fd = open("/dev/pts/2",O_RDONLY);
if (fd == -1) {
perror("open");
...
}
其次,read可能会返回比你请求的更少的字节,看看man:
如果此数字小于请求的字节数,则不是错误;这可能发生 例如,因为现在实际可用的字节数较少(可能是因为我们接近文件结尾,或者因为 我们正在从管道或终端读取,或因为read()被信号中断。
因此读取时甚至可以返回1个字节。第三,读取可能返回-1:
出错时,返回-1,并正确设置errno。
所以我想最好写一下:
ssize_t nread;
if ((nread = read(fd, str, 20) > 0)) {
str[nread] = '\0';
} else if (nread == -1) {
perror("read");
...
}
printf("%s\n",str);
return 0;
}