アカウント名:
パスワード:
あれはUNIXソケットやWindowsでいう名前付きパイプとは違う概念なんだよね…?標準入力と標準出力繋いでるだけの簡単なものと思ってたのに何でWindowsとUNIXで振る舞いが全然違うんだろう
シェルのパイプと同じものはpipe(2) [linuxjm.osdn.jp]で作れて、pipe(7) [linuxjm.osdn.jp]によれば、パイプと名前付きパイプで入出力動作は同じものと書かれている。
Windowsのcmd.exeのパイプは、CreatePipe関数で作る匿名パイプだろう。Windowsのも名前付きパイプとの違いはない。Anonymous Pipe Operations [microsoft.com]に匿名パイプとはユニークな名前の名前付きパイプで実装されていると書かれている。
さて、前半の問いにはこれで回答できたと思うけど、後半の問い(WindowsとUnix)の違いはなんだろう?違いが現れる例を逆に教えてほしい。もちろん、散々指摘されているように、cmd.exeはちゃんとパイプの両側のプロセスが同時に動くからね、それ以外で頼む。
「Windowsの」がWindowsのコマンドプロンプトのことなら、昔はMS-DOS時代のしがらみで一時ファイル作って逐次実行してたけど、NT系のcmd.exeは同時実行するよ。ping -t localhost | findstr ms とか実行してみれば確認できるはず。
Windows の名前付きパイプってそんなに不便なものなの?UNIX にも名前付きパイプがあって、mkfifo で作れるわけだけど、GNU 版 diff だと、二つのファイルのどちらも fifo にすることができて、
mkfifo tmpgzip -dc b.gz > tmp &gzip -dc a.gz | diff - tmp > result
てなことをして、でっかい一時ファイルを作らずに済ませたものだ。
シェルのパイプは「一時ファイルをつくっているような動作で前のものが完了しないと次に進まない」だけどWindows の名前付きパイプは全くの別物だ。
シェルは動作の互換性で旧来の方式を使ってるだけかと。
その例、bashやzshを使っているなら、プロセス置換使えば1行で書けて便利です。これも内部ではmkfifoが使われています(ls -l <(echo)すれば分かる)。
diff <(gzip -dc a.gz) <(gzip -dc b.gz) > result
>一時ファイルをつくっているような動作で前のものが完了しないと次に進まないそんなうんこな実装してんのMS-DOSとWindows 9xだけですが老害の知識で語るなよ
MS-DOS時代から頭の中身がまったく進歩していない老害の見本
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike
シェルのパイプってなにものなの (スコア:0)
あれはUNIXソケットやWindowsでいう名前付きパイプとは違う概念なんだよね…?標準入力と標準出力繋いでるだけの簡単なものと思ってたのに何でWindowsとUNIXで振る舞いが全然違うんだろう
Re:シェルのパイプってなにものなの (スコア:1)
シェルのパイプと同じものはpipe(2) [linuxjm.osdn.jp]で作れて、pipe(7) [linuxjm.osdn.jp]によれば、パイプと名前付きパイプで入出力動作は同じものと書かれている。
Windowsのcmd.exeのパイプは、CreatePipe関数で作る匿名パイプだろう。Windowsのも名前付きパイプとの違いはない。Anonymous Pipe Operations [microsoft.com]に匿名パイプとはユニークな名前の名前付きパイプで実装されていると書かれている。
さて、前半の問いにはこれで回答できたと思うけど、後半の問い(WindowsとUnix)の違いはなんだろう?違いが現れる例を逆に教えてほしい。もちろん、散々指摘されているように、cmd.exeはちゃんとパイプの両側のプロセスが同時に動くからね、それ以外で頼む。
Re:シェルのパイプってなにものなの (スコア:1)
「Windowsの」がWindowsのコマンドプロンプトのことなら、昔はMS-DOS時代のしがらみで一時ファイル作って逐次実行してたけど、NT系のcmd.exeは同時実行するよ。
ping -t localhost | findstr ms とか実行してみれば確認できるはず。
Re: (スコア:0)
Windows の名前付きパイプってそんなに不便なものなの?
UNIX にも名前付きパイプがあって、mkfifo で作れるわけだけど、GNU 版 diff だと、二つのファイルのどちらも fifo にすることができて、
てなことをして、でっかい一時ファイルを作らずに済ませたものだ。
Re: (スコア:0)
シェルのパイプは「一時ファイルをつくっているような動作で前のものが完了しないと次に進まない」だけど
Windows の名前付きパイプは全くの別物だ。
シェルは動作の互換性で旧来の方式を使ってるだけかと。
Re: (スコア:0)
その例、bashやzshを使っているなら、プロセス置換使えば1行で書けて便利です。これも内部ではmkfifoが使われています(ls -l <(echo)すれば分かる)。
Re: (スコア:0, フレームのもと)
>一時ファイルをつくっているような動作で前のものが完了しないと次に進まない
そんなうんこな実装してんのMS-DOSとWindows 9xだけですが
老害の知識で語るなよ
Re: (スコア:0)
MS-DOS時代から頭の中身がまったく進歩していない老害の見本