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