[英]Not able to read data from other terminal using read() system call
大家好,我在伪终端/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”,并且在终端/dev/pts/1
上显示了丢失的字符n
。 但是,当我尝试从终端/dev/pts/1
读取时,我可以正确读取每个字符。 因此,我无法理解该程序的行为。 请帮帮我。 提前致谢。 :)
首先,您可能有另一个从/ dev / pts / 2读取的进程,因此将字符发送给它,而不是您的。 然后,该终端可能通过其他过程(这是某些shell所做的)设置为读取“每个字符一个字符”模式,您只读取一个字符。
哇。 首先,这是一个普遍的好规则:检查返回给您的是什么系统调用。 阿拉维斯。
int main(){
char str[50];
int fd = open("/dev/pts/2",O_RDONLY);
if (fd == -1) {
perror("open");
...
}
其次,读取可能返回的字节数少于您请求的字节数,请查看man:
如果此数目小于请求的字节数,这不是错误; 例如,这可能是因为当前实际可用的字节较少(可能是因为我们接近文件末尾,或者因为我们正在从管道或终端读取),或者因为read()被a中断了。信号。
因此,即使读取也可能返回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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.