読者です 読者をやめる 読者になる 読者になる

【Linux】パイプラインについて勉強しました

前回
http://mo7.hatenablog.jp/entry/2016/12/18/203000
に引き続いてLinuxについての備忘録。
今回も参考にした書籍の他に、ネットで調べた情報も多く含む。


参考書はこちら

パイプライン

パイプラインとは何か

通常、標準入力はキーボードに、標準出力はディスプレイに割り当てられている。つまりキーボード→コマンド→ディスプレイという順で何らかのデータが出力される。

これに対してパイプラインを使えば2つのコマンドを同時に実行して(組み合わせて)もっと高度な処理を行える。上記と同じように書くならば、キーボード→コマンド→パイプライン→コマンド→ディスプレイとなる。


パイプのプログラミングの手順
①パイプを作る
②フォークする
③入口と出口を閉じる

ディレクト

絶対パスはルートディレクトリから目的のファイルまで/でつなぐ
相対パスは現在のディレクトリから目的のファイルまでパス指定

シェル

Linuxにおけるコマンドインタプリンタのこと
・インタプリンタとは指令を読み込んで解釈・実行するプログラム

リダイレクト

・シェルを用いて入出力先を別の入出力先に変更すること
・パイプでは別のプログラムへ結果を送ることもできる

プログラム

int pipe(fd[2])

とすることでfdにファイルディスクリプタが格納される。要は配列の0がread、1がwriteに対応することになる。

パイプラインの手順をプログラムにするとこんな感じ。当然これだけではエラーしか起こらないので注意。

パイプを探す処理
int fd[2];
引数の処理
if(pipe(fd) < 0){
  perror("pipe");
}
else{
  int read = fd[0];
  int write = fd[1];

  if(fork() == 0){  // パイプライン前
    close(read);
    dup2(write,STDOUT_FILENO);
    close(write);
  処理
  }
  if(fork() == 0){  // パイプライン後
    clsoe(write);
    dup2(read,STDIN_FILENO);
    close(read);
  処理
  }
  close(read);
  close(write);
  wait(&st);
  wait(&st);
}

dup2はファイルディスクリプタを複製するシステムコール

ひとこと

正直よくわからない( ゚Д゚)

広告を非表示にする