オペレーティングシステムの3番目の実験レポート:パイプライン

  • 名前:朱Duxin
  • 学生ID:201821121021
  • クラス:1811を計算

1.プログラムを書く

 1.パイプの命名(読み取りと書き込みは後でパイプ名を指定するため、ここでの作成プロセスでもプログラムで指定されたメソッドを使用します。)
  1 #include <stdio.h>
   2 #include <sys / types.h>
   3 #include <sys / stat.h>
   4  int main(){
   5      int temp = mkfifo(" fifo "0777 ); //作成パイプラインfifo
   6      if(temp ==- 1 ){//成功した場合は0を返し、-1
   7          perror(" defeat " );
   8          return - 1 ;
   9      }
  10      return  0 ;
  11 }

 

そのため、INTはmkfifo(のconst のchar *のパス名、mode_tモード);パイプライン手段のパラメータモードそのファイルのパーミッション、私は単にコンテンツの権利を開催しますので、以下の内容で表さ権について:

 権威  解説  権威  解説
 r--  読み取り専用  -w-  書き込みのみ
 - バツ 実行可能のみ   rw-  読み書き可能
 -wx  書き込み可能な実行可能ファイル  処方箋  読み取り可能で実行可能
 rwx  読み取り可能、書き込み可能、​​実行可能  ---  許可なし

 そして、これらのアクセス許可は通常8進数で表されます(バイナリも使用でき、特定のバイナリはそれ自体で変換できます)。

権威 オクタル
--- 0
バツ 1
w 2
wx
r 4
処方箋 5
rw 6
rwx 7

これは実験なので、モードは777を選択し、実験に便利です。

そして有名なパイプを作成するには、コマンドmkfifo nameを使用して直接作成できます。

2.fifo_read.c
  1 #include <unistd.h>
   2 #include <stdlib.h>
   3 #include <errno.h>
   4 #include < string .h>
   5 #include <fcntl.h>
   6 #include <stdio.h>
   7  
  8  int main(){
   9      int fifo_read = open(" fifo " 、O_RDONLY);
 10      if(fifo_read ==- 1 ){
  11          perror(" open " );
 12          リターン - 1 13      }
  14 
 15     while1 ){
  16          文字のバッファ[ 128 ] = { 0 };
 17          int flag = read(fifo_read、buffer、128 );
 18          if(flag == 0 ){
  19              printf(" it is closed " );
 20              休憩;
 21          }
  22          printf(" read:%s from fifo \ n " 、buffer);
 23      }
  24 
 25      close(fifo_read);
 26      返品 0;
 27 }

 

3.fifo_write.c
  1 #include <stdio.h>
   2 #include <stdlib.h>
   3 #include <signal.h>
   4 #include <unistd.h>
   5 #include < string .h>
   6 #include <fcntl.h>
   7  
  8  int main(){
   9      int fifo_write = open(" fifo " 、O_WRONLY);
 10      if(fifo_write ==- 1 ){
  11          perror(" open " );
 12          リターン - 1 13      }
  14 
 15     while1 ){
  16          文字のバッファ[ 128 ] = { 0 };
 17          文字 * 検索;
 18          fgets(バッファ、128 、標準入力);
 19          find = strchr(buffer、' \ n ' );
 20          if (find){
  21              * find = ' \ 0 ' ;
 22          }
  23          if(strcmp(buffer、" end ")== 0 ){
  24              break ;
 25          }
  26          write(fifo_write、buffer、strlen(buffer));
 27      }
  28      close(fifo_write);
 29は     0を返し ます30 }

 

2.運用結果を分析する

 fifo_write書き込み:

 

 fifo_read読み取り:

3.この実験を通じて新しい質問と回答を生成する

 最初のテストで、読者が情報を受信したことがわかりましたが、表示結果を1行に出力できず、情報受信後の内容を表示できず、次にメッセージを受信するまで表示されませんでした。

書く:

読んだ:

 

 コードを分析し、問題がfgets()が入力コンテンツを読み取るときに改行文字を一緒に書き込むため、コード内を調べて、helloの後に上記の図が表示されず、helloの後の元のコンテンツが次の行に移動することが問題であることを確認します改行文字とそれを置き換えると、問題を効果的に解決できます。

 

おすすめ

転載: www.cnblogs.com/duxinZhu/p/12708207.html