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

时间:2011-03-05 09:15:35

标签: 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;

}

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读取时,我可以正确阅读每个角色。 所以我无法理解这个程序的行为。请帮帮我。提前致谢。 :)

2 个答案:

答案 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;
}