Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法使用read()系统调用从其他终端读取数据_C_Linux_Operating System_Terminal - Fatal编程技术网

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