tutorial for libuvによれば、後でuv_write
を呼び出すと、別の書き込みをブロックする書き込みが発生してはなりません(別のスレッドで発生するはずです)。
しかし、私はstrace
の下のサンプルコードを実行しましたが、そうではないようです。 uv_fs_write
を使って同様の例を実行すると、書き込みの呼び出しは別のスレッドで行われ、ブロックされないことがわかります。uv_writeは実際には非同期ですか?
期待される振る舞いがuv_write
のものであることを誰かが説明し、基礎となるストリームがファイルハンドルであるときにuv_fs_write
と異なるはずですか?
cat Makefile | strace ./uvtee/uvtee ~/out.txt
open("/home/james/out.txt", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 11
ioctl(11, FIONBIO, [1]) = 0
epoll_ctl(6, EPOLL_CTL_ADD, 7, {EPOLLIN, {u32=7, u64=7}}) = 0
epoll_ctl(6, EPOLL_CTL_ADD, 9, {EPOLLIN, {u32=9, u64=9}}) = 0
epoll_ctl(6, EPOLL_CTL_ADD, 0, {EPOLLIN, {u32=0, u64=0}}) = 0
epoll_wait(6, [{EPOLLIN|EPOLLHUP, {u32=0, u64=0}}], 1024, -1) = 1
brk(0xb3e000) = 0xb3e000
read(0, "examples=\\\n\thelloworld\\\n\tidle-ba"..., 65536) = 1965
write(1, "examples=\\\n\thelloworld\\\n\tidle-ba"..., 1965) = 1965
write(11, "examples=\\\n\thelloworld\\\n\tidle-ba"..., 1965) = 1965
フルコードはhereです。
私はそれを修正しました。うまくいけば、今は少しはっきりしています。 – js7222
リンク先の例が適切な例ですか?ファイルをパイプのように扱うようですが、通常のファイルを参照するファイル記述子のuv_pipe_open()を呼び出します。これは質問のポイントをバイパスしているようです。 – nos
申し訳ありません。この例では、パイプを使用してファイルハンドルを抽象化しています。パイプを使ってファイルを処理し、uv_writeを呼び出すのがuv_fs_writeを使うのとは異なる振る舞いをすることを期待しているかどうか本当に知りたかったのですか? uv_write_writeはスレッドが書き込みのために生成されているのに対し、uv_writeは同じスレッドに書き込みを行うためのシーケンシャルな呼び出しを行います。 – js7222