C 无法使用read()系统调用从其他终端读取数据
大家好,我正在伪终端C 无法使用read()系统调用从其他终端读取数据,c,linux,operating-system,terminal,C,Linux,Operating System,Terminal,大家好,我正在伪终端/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;
/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;
在终端/dev/pts/2
上,我键入了“anirudh”,但它在终端上显示了“airudh”,并且缺少的字符n
显示在终端/dev/pts/1
上。
但是,当我尝试从终端读取时,我可以正确读取每个字符。
所以我无法理解这个程序的行为。请帮帮我。提前感谢。:) 哇。首先,这是一条很好的一般规则:检查返回给您的系统调用。总是这样
int main(){
char str[50];
int fd = open("/dev/pts/2",O_RDONLY);
if (fd == -1) {
perror("open");
...
}
第二,read返回的字节可能比您请求的少,请看man:
如果该数字小于请求的字节数,则不是错误;这种情况可能发生在
例如,因为现在实际可用的字节更少(可能是因为我们快到文件末尾了,或者是因为
我们正在从管道或终端进行读取),或者因为read()被信号中断
因此,即使从读取中返回1个字节。第三,read可能返回-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;
}
首先,您可能有另一个进程读取/dev/pts/2,因此字符被发送到它,而不是您的。然后,终端可能被另一个进程设置为“每字符读取”模式(这是一些shell所做的),您只读取一个字符。只是想澄清一下。如果您的程序没有在pts1中运行类型“w”,您将看到进程从pts2读取(它可能是/bin/bash),然后在pts2中运行您的程序并在pts1中再次键入“w”,您将看到进程读取将是您的程序-在这种情况下,一切正常。
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;
}