나는 시스템 프로그래밍을 배우고 있으며 다음 코드를 실행할 때
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
char buff[5];
setvbuf(stderr, buff, _IOFBF, 5);
for (int i = 1; i < 10; i++) {
fprintf(stderr, "%d", i);
}
_exit(0);
}
setvbuf
stderr
5 바이트 크기의 버퍼로 완전히 버퍼링 된 정책을 부과하고 있으므로 얻을 것으로 예상 12345
했지만 대신 인쇄합니다 1234567
. 왜 그런가요 ?
strace-ing 프로그램은 glibc에 대해 컴파일 될 때 먼저 크기 1의 쓰기를 수행 한 다음 크기 5의 쓰기를 수행하고 마지막으로 크기 1의 쓰기를 수행함을 보여줍니다.
$ strace -o /dev/stdout -e write,writev ./a.out 2>/dev/null
write(2, "1", 1) = 1
write(2, "23456", 5) = 5
write(2, "7", 1) = 1
musl을 사용하면 크기 1의 7 번 쓰기를 수행합니다.
$ strace -o /dev/stdout -e write,writev ./a.out 2>/dev/null
writev(2, [{iov_base="1", iov_len=1}, {iov_base=NULL, iov_len=0}], 2) = 1
writev(2, [{iov_base="2", iov_len=1}, {iov_base=NULL, iov_len=0}], 2) = 1
writev(2, [{iov_base="3", iov_len=1}, {iov_base=NULL, iov_len=0}], 2) = 1
writev(2, [{iov_base="4", iov_len=1}, {iov_base=NULL, iov_len=0}], 2) = 1
writev(2, [{iov_base="5", iov_len=1}, {iov_base=NULL, iov_len=0}], 2) = 1
writev(2, [{iov_base="6", iov_len=1}, {iov_base=NULL, iov_len=0}], 2) = 1
writev(2, [{iov_base="7", iov_len=1}, {iov_base=NULL, iov_len=0}], 2) = 1
writev(2, [{iov_base="8", iov_len=1}, {iov_base=NULL, iov_len=0}], 2) = 1
writev(2, [{iov_base="9", iov_len=1}, {iov_base=NULL, iov_len=0}], 2) = 1
+++ exited with 0 +++
따라서 두 C 라이브러리 구현 모두의 size
인수를 setvbuf(stream, buf, _IOFBF, size)
최대 값으로 취급 하고 버퍼가 가득 차기 전에 자유롭게 플러시 할 수 있습니다.
AFAICS는이 해석에 반하는 표준에 아무것도없는 것 같습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다