1

私は、o'reilly の Linux デバイス ドライバー ブック バージョン 3 からプログラム コードを挿入して作成した tty の書き込みと読み取りに、単純なパイプ プログラミングを使用しています。これを 経由insmodで挿入し、 という名前のデバイスを取得しましたtinytty0

私の質問は、このデバイスを使用して、パイプ経由でデータを読み書きできるかどうかです。一度試してみたところ、データはドライバに書き込んでいますが、読み込みは行われていません。理由がわかりません。コードは以下のとおりです

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include<fcntl.h>

int main(void)
{
        int     fd[2], nbytes;
        pid_t   childpid;
        char    string[] = "Hello, world!\n";
        char    readbuffer[80];



        pipe(fd);

        if((childpid = fork()) == -1)
        {
                perror("fork");
                exit(1);
        }

        if(childpid == 0)
        {
                /* Child process closes up input side of pipe */
                close(fd[0]);
            fd[1]=open("/dev/ttytiny0",O_WRONLY);   
        if(fd[1]<0)
        {
            printf("the device is not opened\n");
            exit(-1);
        }   
                /* Send "string" through the output side of pipe */
                write(fd[1], string, (strlen(string)+1));
                exit(0);
        }
        else
        {

                /* Parent process closes up output side of pipe */
                close(fd[1]);
        fd[0]=open("/dev/ttytiny0",O_RDONLY);
        if(fd[0]<0)
        {
            printf("the device is not opened\n");
            exit(-1);
        }
                /* Read in a string from the pipe */
                nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
                printf("Received string: %s", readbuffer);
        }

        return(0);
}
4

1 に答える 1

1

tinytty本のドライバーが何をするかを誤解しているに違いありませんLinux Device Drivers。本から:

このサンプルの tiny tty ドライバーは、実際のハードウェアには接続しないため、その書き込み関数は、書き込まれるはずだったデータをカーネル デバッグ ログに記録するだけです。

これはある種のループバック TTY ドライバーではありません。実際、't'デバイスから読み取っているものに 2 秒ごとに一定の文字 ( ) を送信します (関数を参照tiny_timer)。

さて、配管の問題に進みましょう。あなたのコードからわかることは、基本的にパイプを作成したことです。次に、子プロセスでパイプの読み取り側を閉じ、デバイスへのファイル記述子に置き換えることで書き込み側を破棄しますtiny tty(基本的に開いているファイル記述子をリークしているため、これは悪い習慣です)。次に、親プロセスで、パイプの書き込み側を閉じ、読み取り側を破棄します (まだ悪い習慣です。つまり、「開いているファイル記述子をリークする」)。最後に、同じ親プロセスで、 と呼ぶものから読み取ろうとしますがpipe、これは実際にはもうパイプではありません。一方の端を閉じてもう一方を記述子に置き換えたためです。tiny ttyデバイス。さらに、ドライバーのタイマー (2 秒ごとにオフになります) がオフになっていない可能性があります。これは、読み取るものが何もないことを意味します。これで問題が説明できると思います。


興味のある方は、ここで参照されている本は、Creative Commons Attribution-ShareAlike 2.0 ライセンスの条件の下でLWN.netから入手できます。サンプル ドライバー/コードはO'Reillyから入手できます。

于 2011-07-19T03:18:12.793 に答える