2011-07-12 12 views
1

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

私の質問は私がこのデバイスを使ってパイプでデータを読み書きすることができますか?私は一度試してみましたが、データはドライバに書かれていますが、読書は行われていません。私は理由を知りません。コードは、あなたがLinux Device Drivers本からtinyttyドライバーが何を誤解されている必要があり

#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); 
} 
+0

読み取り値(nbytesの値)の戻り値は何ですか? – SKi

答えて

1

以下の通りです。本から:

このサンプルの小さなttyドライバは、実際のハードウェアに、書かれることになったものをデータカーネルのデバッグログに ションfunc-その書き込みは、単にレコードのように、接続されません。

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

今、あなたの配管問題に。私があなたのコードから見たのは、基本的にパイプを作成したことです。あなたの子プロセスでは、パイプの読み込み終了を閉じ、ファイルディスクリプタをファイルディスクリプタに置き換えて書き込み終了を破棄します(これは基本的に開いているファイルディスクリプタをリークしたので悪いことです)。その後、親プロセスでパイプの書き込み終了を閉じ、読み取り終了を破棄します(悪い習慣、つまり "ファイル記述子が漏れています")。最後に、同じ親プロセスで、pipeと呼ばれるものから読み取るようにします。これは実際にはパイプではなくなります。一方の端を閉じ、もう一方の端をtiny ttyデバイスの記述子で置き換えたからです。さらに、ドライバーのタイマー(2秒ごとに消えています)はおそらく消えていません。つまり、読むことは何もありません。私はあなたの問題を説明すると信じています。興味がある人々のために


、ここで参照している本は、LWN.netからクリエイティブコモンズ表示 - 継承2.0ライセンスの条件の下で利用可能であり、例えばドライバ/コードは、O'Reillyから入手可能です。

関連する問題