3

Resource Temporically Unavailable(11)の読み取り/書き込みエラーが発生する疑似端末スレーブがあります。私はこの問題を解決することができませんでしたが、一週間前まで私は何もptyを知りませんでした。だから、私は明らかな何かを見逃しているかもしれません。

read()私が読んだことから、これは非ブロッキングptyを呼び出すことによって引き起こされる可能性があります。F_GETFLただし、スレーブptyの後でチェックするopen()と、値はそれがブロッキングファイル記述子であることを示しています。

の出力はF_GETFLO_NONBLOCKフラグが無効になっていて、O_RDWRフラグが有効になっていることを示しています。

printf("F_GETFL: %x\n", fcntl( slavefd, F_GETFL)); // outputs F_GETFL: 2

いつ準備ができているかを判断するためにslavefdを使用して、非ブロッキングファイルとして扱うことも試みました。select()しかし、それは毎回タイムアウトするだけです。

では、がブロッキングに設定されている場合、なぜread()errnoをResource Temporically Unavailableに設定するのですか?slavefdのフラグはF_GETFL正しいですか?この問題の原因を絞り込むために他に何を試みることができますか?

更新:(詳細)

まだわかりませんが、ptyスレーブデバイスノードがpppdによって何らかの形でロックされていると思います。私はあなたがptyスレーブにエコーすることができると言われました、それはpppdがそれを使用しているときを除いて本当のようです。

アップデート2:(コードを追加)

if (argc!=2)
    return;

printf("opening %s\n", argv[1]);
slavefd = open(argv[1], O_RDWR );
if (slavefd < 0)
    return;

このアップデートは、スレーブデバイスを開く方法を示しています。このアプリケーションをデバッグに使用しているので、直接使用してargv[1]います。

問題が解決しました:

読み取り/書き込みを試みていたスレーブノードがpppdによって変更されていました。pppdがtty/ptyデバイスを制御すると、回線の規律がからN_TTYに変更されN_PPPます。これは、スレーブノードに対してopen()read()またはwrite()スレーブノードに対して、TTYドライバーの代わりにPPP中間ドライバーが使用されていることを意味します。つまり、aread()write()はまったく異なる関数に要約されます。N_PPPドライバーを見ると、次のことがわかりました。これは、なぜEAGAINが返送されたのかという私の質問に答えます。

/*
 * Read does nothing - no data is ever available this way.
 * Pppd reads and writes packets via /dev/ppp instead.
 */
static ssize_t
ppp_asynctty_read(struct tty_struct *tty, struct file *file,
          unsigned char __user *buf, size_t count)
{
    return -EAGAIN;
}

/*
 * Write on the tty does nothing, the packets all come in
 * from the ppp generic stuff.
 */
static ssize_t
        ppp_asynctty_write(struct tty_struct *tty, struct file *file,
           const unsigned char *buf, size_t count)
{
    return -EAGAIN;
}
4

1 に答える 1

1

読み取り/書き込みを試みていたスレーブノードがpppdによって変更されていました。pppdがtty/ptyデバイスを制御すると、回線の規律がからN_TTYに変更されN_PPPます。これは、スレーブノードに対してopen()read()またはwrite()スレーブノードに対して、TTYドライバーの代わりにPPP中間ドライバーが使用されていることを意味します。つまり、aread()write()はまったく異なる関数に要約されます。N_PPPドライバーを見ると、次のことがわかりました。これは、なぜEAGAINが返送されたのかという私の質問に答えます。

/*
 * Read does nothing - no data is ever available this way.
 * Pppd reads and writes packets via /dev/ppp instead.
 */
static ssize_t
ppp_asynctty_read(struct tty_struct *tty, struct file *file,
          unsigned char __user *buf, size_t count)
{
    return -EAGAIN;
}

/*
 * Write on the tty does nothing, the packets all come in
 * from the ppp generic stuff.
 */
static ssize_t
        ppp_asynctty_write(struct tty_struct *tty, struct file *file,
           const unsigned char *buf, size_t count)
{
    return -EAGAIN;
}
于 2012-08-08T15:02:21.557 に答える