[Unix] Unixのパイプの動きを考える

[How do Unix pipes work?](https://www.vegardstikbakke.com/how-do-pipes-work-sigpipe/)を読みました。 ```bash `gutter:false; $ cat hogehoge.txt | head -n 2 ``` 上記を実行した時にhogehoge.txtが大きなファイルでも2行出力した途端に停止します。 cat hogehoge.txtだけした時には時間がかかるのに、pipeで繋いだ時には一瞬で終わるのはどうしてか? Unixのpipeは後ろの処理が終了した時にSIGPIPEシグナルで前のプロセスが停止するそうです。 記事の中ではpythonとgoでcatを作成してSIGPIPEを受けて停止するように作成する例が出ていました。 RubyやSwiftではどうやってやるのでしょうか。 ## Rubyの場合 ```ruby `gutter:true; #! ruby -Ku while gets puts $_ end ``` SIGPIPEをよしなに処理してくれるようです。 ## Swiftの場合 Swiftの場合は、ファイルから順に読み込んで処理するメソッドがなかったので、StreamReaderを作成する必要がありました。 StreamReaderを作成すれば以下のように処理できます。 ```c `gutter:true; import Foundation for argument in CommandLine.arguments { if let streamReader = StreamReader(path: argument) { defer { streamReader.close() } while let line = streamReader.nextLine() { print(line) } } } ``` [source](https://github.com/k28/swift_study/tree/master/command_line_tool)はこちら rubyはコマンドラインツールを作成するのがしやすいと思いました。 ## 参考URL - [Read a file/URL line-by-line in Swift](https://stackoverflow.com/questions/24581517/read-a-file-url-line-by-line-in-swift)

0 件のコメント :

コメントを投稿