1

PTY を表すファイル記述子に読み取りタイムアウトを設定しようとしています。VMIN = 0 と VTIME = 10 を termios に設定しました。これは、文字が利用可能になったときに返されるか、文字が利用できない場合は 1 秒後に返されることを期待しています。ただし、私のプログラムは読み取り呼び出しに永遠に留まります。

これを機能させない PTY の特別な点はありますか? これを機能させる他の TERMIOS 設定はありますか? stdin ファイル記述子でこれと同じ構成を試したところ、期待どおりに機能しました。

#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <fcntl.h>

#define debug(...) fprintf (stderr, __VA_ARGS__)

static void set_term (int fd)
{
    struct termios termios;
    int res;

    res = tcgetattr (fd, &termios);
    if (res) {
        debug ("TERM get error\n");
        return;
    }

    cfmakeraw (&termios);
    termios.c_lflag &= ~(ICANON);
    termios.c_cc[VMIN] = 0;
    termios.c_cc[VTIME] = 10;        /* One second */

    res = tcsetattr (fd, TCSANOW, &termios);
    if (res) {
        debug ("TERM set error\n");
        return;
    }

}

int get_term (void)
{
    int fd;
    int res;
    char *name;

    fd = posix_openpt (O_RDWR);
    if (fd < 0) {
        debug ("Error opening PTY\n");
        exit (1);
    }

    res = grantpt (fd);
    if (res) {
        debug ("Error granting PTY\n");
        exit (1);
    }

    res = unlockpt (fd);
    if (res) {
        debug ("Error unlocking PTY\n");
        exit (1);
    }

    name = ptsname (fd);
    debug ("Attach terminal on %s\n", name);

    return fd;
}

int main (int argc, char **argv)
{
    int read_fd;
    int bytes;
    char c;

    read_fd = get_term ();

    set_term (read_fd);
    bytes = read (read_fd, &c, 1);
    debug ("Read returned\n");

    return 0;
}
4

1 に答える 1

0

Linux pty(7)のマンページから(イタリック体は私のものです):

疑似端末 (「pty」と略されることもあります) は、双方向の通信チャネルを提供する仮想キャラクター デバイスのペアです。チャネルの一端はマスターと呼ばれます。もう一方の端はスレーブと呼ばれます。 疑似端末のスレーブ エンドは、従来の端末とまったく同じように動作するインターフェイスを提供します。

ただし、プログラムはマスターから読み取っているため、端末デバイスとまったく同じように動作することは期待できません

したがって、最後の数行を変更/展開するとget_term...

int slave_fd =  open (name, O_RDWR); /* now open the slave end..*/
if (slave_fd < 0) {
   debug ("Error opening slave PTY\n");
   exit (1);
}

return slave_fd; /* ... and use it instead of the master..*/

... サンプル プログラムは期待どおりに動作します。

于 2012-05-26T17:56:10.047 に答える