Невозможно прочитать данные с другого терминала с помощью системного вызова read () - PullRequest
0 голосов
/ 05 марта 2011

Привет всем! Я запускаю следующий код на псевдотерминале /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 ]

1 голос
/ 05 марта 2011

Во-первых, у вас, вероятно, есть другой процесс, читающий из / dev / pts / 2, и поэтому символы отправляются на него, а не на ваш. Затем этот процесс, вероятно, переводит терминал в режим чтения "char per char" (это то, что делает какая-то оболочка), вы читаете только один символ.

0 голосов
/ 05 марта 2011

Ничего себе.Во-первых, это общее хорошее правило: проверьте, какие системные вызовы возвращены вам.Всегда.

int main(){

    char str[50];

    int fd = open("/dev/pts/2",O_RDONLY);
    if (fd == -1) {
        perror("open");
        ...
    }

Во-вторых, чтение может вернуть меньше байтов, чем вы запрашиваете, посмотрите на человека:

Это не ошибка, если это число меньше, чем числозапрошенные байты;это может произойти, например, потому что на самом деле сейчас доступно меньше байтов (может быть, потому что мы были близки к концу файла, или потому что мы читаем из канала, или из терминала), или потому что 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...