繁体   English   中英

无法使用read()系统调用从其他终端读取数据

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM