4

以下のコードは IO のノンブロッキング読み取りの例ですがterminal、コンソールに文字を入力してもすぐには出力されません。以前に を設定する必要があるとあなたが言うかもしれないので、stty -icanon標準モードは無効になっていstty icanonます。 、文字を入力すると、 fd が読み取り可能になるため、すぐに文字が出力されます。character-orientedcannonical

#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

#define MSG_TRY "try again\n"

int main(void)
{
 char buf[10];
 int fd, n;
 fd = open("/dev/tty", O_RDONLY|O_NONBLOCK);
 if(fd<0) {
    perror("open /dev/tty");
    exit(1);
 }
 tryagain:
   n = read(fd, buf, 10);
   if (n < 0) {
       if (errno == EAGAIN) {
            sleep(1);
            write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY));
            goto tryagain;
       }    
    perror("read /dev/tty");
    exit(1);
   }
 write(STDOUT_FILENO, buf, n);
 close(fd);
 return 0;
}
4

2 に答える 2

1

私が理解しているように、開いている間に O_NONBLOCK フラグを使用すると、たとえば端末を開こうとすると、モデムの準備が整うのを待たないように open に指示されます。

このソースは非常に役に立ちました。http://en.wikibooks.org/wiki/Serial_Programming/termios#Opening.2FClosing_a_Serial_Device

今日は tty(RS232 ポート) デバイスで作業をしていました。 http://www.gnu.org/software/libc/manual/html_node/Terminal-Modes.html#Terminal-Modes

端末が正規のものか生のものかはどうやってわかりますか? 私があなたを正しく理解していれば、端末を非標準(生)に設定したと言いますが、後で元に戻ります。これは正しいです?その場合、コードのどこでデバイスを非標準に設定しましたか?

raw モードが必要な場合は、cfmakeraw() という関数があります。そして、tcsetattr() で属性を設定することを忘れないでください。たとえば、const struct termios yourtermios yourtermios.c_cc[VTIME]=0; yourtermios.c_cc[VMIN]=1; または、適切と思われる値。

これは、正規かどうかに関する優れた情報源です。 http://www.gnu.org/software/libc/manual/html_node/Canonical-or-Not.html#Canonical-or-Not

于 2013-07-07T20:38:42.957 に答える