ここから本文です

linux上で動くシェルを自作しています。多段階のパイプを実装方法を教えていただけ...

uni********さん

2010/12/1113:02:03

linux上で動くシェルを自作しています。多段階のパイプを実装方法を教えていただけないでしょうか?

現在、linux上で動くシェルを自作しています。
リダイレクト、1段のパイプ、バックグラウンド実行の機能の実装は完了しました。
しかし、多段階のパイプの実装をするにあたって、方針をたてようとしているのですがどうも考えが浮かびません。
大まかな方針だけでも良いので、多段階のパイプを実装方法を教えていただけないでしょうか?

閲覧数:
2,596
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

pin********さん

編集あり2010/12/1115:46:38

多段階というので何をイメージしているのかわからないのだけど、A|B|C を二段階として、パイプは親子じゃないとだめという認識にもとづいて、だから二段以上に工夫が必要だ、という考えだと想像します。答えとしてはどうやってもいいですし、世の中のシェルの実装もいくつもあります。

一つの方法はpipe&forkの二分木でのみで再帰的に構成するの。
|を演算子のように見て左結合で右からやると、
invoke用にforkしたサブシェルが
pipeしてforkして親がinにdup2してexec C。子がoutにdup2して、
pipeしてforkして親がinにdup2してexec B。子がoutにdup2して、
exec A。
とか。最初からみると親->子->孫->...だけど、コードは親子だけに注目して何段でも再帰的にかけるのがみそです。必須じゃないけど、この例の方法だと、パイプの右側が親になります。伝統的なshは左結合で左からexecすると思いますけど、右が親なのは同様です。右結合でやってもいいし、左右どちらを先にexecしてもいい。

別のてとしては、線形に繰り返し構成するの。
fdをソケット渡しするような手がない伝統的なUnixにおいても、pipeは親子関係になくても使ます。どうやるって? そりゃ親からpipeをもらえば兄弟間でなら使えますよね。
invoke用にforkしたサブシェルが
pipe して(これをpipe1としよう)、forkして子がoutにdupしてexec A。
同じサブシェルが
pipe して(これをpipe2としよう)、forkして子がinにpipe1を,outにpipe2をdupしてexec B。
同じサブシェルが
inにpipe2をdupしてexec C。
とか。これは親ひとりと兄弟がいっぱい、という状況になります。最後もforkしてdupしてexec C して、祖母まかせでサブシェルを終了(もしくは待機)するほうが、全員兄弟になってうつくしいかな。
こっちの方が今風かもしれないし、かつ初心者向きかもしれない。これも左右どちらからでもできます。

まぁ、やりかたはいっぱい。シェルのパイプは機能として重要なのであってそれがpipe()である必要すらないのだから、socketで実装したっていいだろう。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo!知恵袋カテゴリ

一覧を見る

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる