머드클럽
머드게임이란?
게임은 어떤 환경에서?
본격적으로 게임해 볼까?
배너교환
머드강좌
일반 머드강좌
성천사님의 머드강좌
혼님의 머드강좌
방울꽃님의 머드강좌
리트님의 머드강좌
2Soo님의 머드강좌
내머드소개하기
접속가능머드
내머드소개하기
자료실
접속 프로그램
머드소스
머드 유틸리티
기타
커뮤니티
공지사항
등업신청
머드클럽에바란다
자유 게시판
질문 AND 답변
머드클럽 갤러리
구인구직
머드게임소개
사신전(死神戰)
사신전 소개
사신전 맵
사신전 명령어 모음집
천명(天命)
천명 소개
천명 맵
천명 명령어 모음집
마이페이지
로그인
회원가입
계정찾기
로그인
회원가입
계정찾기
텍스트머드클럽
검색
setvbuf 함수
성천사
0
33
0
0
2026-01-22 20:02:08
<p>파일 입출력에 렉이 걸려 너무 느리다는 질문에 AI 가 답변을 하게 되서 알게된 함수 입니다.</p> <p> </p> <p>**"입출력 스트림(파일이나 콘솔)에 사용할 전용 바구니(버퍼)를 내가 원하는 크기와 방식대로 설정하는 함수"**</p> <ul data-path-to-node="5"> <li>int setvbuf(FILE *stream, char *buffer, int mode, size_t size);</li> </ul> <p> </p> <p>사용예) setvbuf(fb, NULL, _IOFBF, 1024 * 1024); // 1024 는 1KB 이고 * 1024 는 1MB</p> <p><br /> <b data-index-in-node="0" data-path-to-node="5,0,0"><code data-index-in-node="0" data-path-to-node="5,0,0">stream</code></b>: 설정을 바꿀 파일 포인터 (예: <code data-index-in-node="26" data-path-to-node="5,0,0">stdout</code>, <code data-index-in-node="34" data-path-to-node="5,0,0">stderr</code>, 열려 있는<span style="display: none;"> </span> 파일)</p> <ul data-path-to-node="5"> <li> <p data-path-to-node="5,1,0"><b data-index-in-node="0" data-path-to-node="5,1,0"><code data-index-in-node="0" data-path-to-node="5,1,0">buffer</code></b>: 사용할 메모리 공간의 주소 (보통 <code data-index-in-node="27" data-path-to-node="5,1,0">NULL</code>을 넣어 시스템이 알아서 잡게 합니다.)</p> </li> <li> <p data-path-to-node="5,2,0"><b data-index-in-node="0" data-path-to-node="5,2,0"><code data-index-in-node="0" data-path-to-node="5,2,0">mode</code></b>: 버퍼링의 종류 (가장 중요한 부분입니다!)</p> </li> <li> <p data-path-to-node="5,3,0"><b data-index-in-node="0" data-path-to-node="5,3,0"><code data-index-in-node="0" data-path-to-node="5,3,0">size</code></b>: 버퍼의 크기 (사용자님이 자주 쓰시는 <code data-index-in-node="27" data-path-to-node="5,3,0">MAX_INPUT_LENGTH</code> 같은 값을 줄 수 있죠.)</p> </li> </ul> <hr data-path-to-node="6" /> <h3 data-path-to-node="7">1. 세 가지 버퍼링 모드 (<code data-index-in-node="16" data-path-to-node="7">mode</code>)</h3> <p data-path-to-node="8">이 모드에 따라 데이터가 "언제" 실제로 출력되는지가 결정됩니다.</p> <table data-path-to-node="9"> <thead> <tr> <td><strong>모드</strong></td> <td><strong>상수명</strong></td> <td><strong>설명</strong></td> <td><strong>비고</strong></td> </tr> </thead> <tbody> <tr> <td><b data-index-in-node="0" data-path-to-node="9,1,0,0">풀 버퍼링</b></td> <td><code data-index-in-node="0" data-path-to-node="9,1,1,0">_IOFBF</code></td> <td>버퍼가 <b data-index-in-node="4" data-path-to-node="9,1,2,0">가득 찼을 때만</b> 실제로 데이터를 씁니다.</td> <td>파일 출력 시 가장 빠름</td> </tr> <tr> <td><b data-index-in-node="0" data-path-to-node="9,2,0,0">라인 버퍼링</b></td> <td><code data-index-in-node="0" data-path-to-node="9,2,1,0">_IOLBF</code></td> <td>**줄바꿈 문자(<code data-index-in-node="9" data-path-to-node="9,2,2,0">\n</code>)**가 들어오면 즉시 씁니다.</td> <td>콘솔(<code data-index-in-node="3" data-path-to-node="9,2,3,0">stdout</code>) 기본값</td> </tr> <tr> <td><b data-index-in-node="0" data-path-to-node="9,3,0,0">무버퍼링</b></td> <td><code data-index-in-node="0" data-path-to-node="9,3,1,0">_IONBF</code></td> <td>버퍼링 없이 <b data-index-in-node="7" data-path-to-node="9,3,2,0">즉시</b> 씁니다.</td> <td>에러 로그(<code data-index-in-node="6" data-path-to-node="9,3,3,0">stderr</code>)용</td> </tr> </tbody> </table> <hr data-path-to-node="10" /> <h3 data-path-to-node="11">2. 왜 <code data-index-in-node="5" data-path-to-node="11">setvbuf</code>를 쓰나요? (실무적 이유)</h3> <ol data-path-to-node="12" start="1"> <li> <p data-path-to-node="12,0,0"><b data-index-in-node="0" data-path-to-node="12,0,0">성능 최적화</b>: 매번 하드디스크에 기록하면 서버가 엄청 느려집니다. 이때 <code data-index-in-node="57" data-path-to-node="12,0,0">_IOFBF</code>(풀 버퍼링)를 쓰고 크기를 크게(예: 8KB) 잡으면, 모았다가 한 방에 쓰기 때문에 속도가 비약적으로 빨라집니다.</p> </li> <li> <p data-path-to-node="12,1,0"><b data-index-in-node="0" data-path-to-node="12,1,0">로그 실시간 확인</b>: 서버가 죽었을 때 로그가 파일에 다 안 적히고 잘리는 경우가 있죠? 그때 로그 파일 스트림을 <code data-index-in-node="63" data-path-to-node="12,1,0">_IONBF</code>(무버퍼링)로 설정하면 터지는 순간까지의 모든 기록을 즉시 남길 수 있습니다.</p> </li> <li> <p data-path-to-node="12,2,0"><b data-index-in-node="0" data-path-to-node="12,2,0">사용자 응답성</b>: 머드 게임에서 "환영합니다!"를 보냈는데 버퍼에 갇혀서 안 나타나면 안 되겠죠? 그럴 때 <code data-index-in-node="59" data-path-to-node="12,2,0">_IOLBF</code>를 사용합니다.</p> </li> </ol> <hr data-path-to-node="13" /> <h3 data-path-to-node="14">3. 실전 사용 예시</h3> <p data-path-to-node="15"><button _ngcontent-ng-c847612972="" aria-label="코드 복사" jslog="179062;track:generic_click,impression;BardVeMetadataKey:[["r_6e7cc55196aefe25","c_76082f8beaed1e84",null,"rc_75b1b5674cb46e2f",null,null,"ko",null,1,null,null,1,0]];mutable:true" mat-icon-button="" mat-ripple-loader-centered="" mat-ripple-loader-class-name="mat-mdc-button-ripple" mat-ripple-loader-uninitialized="" mattooltip="코드 복사"></button></p> <p data-path-to-node="15"><span style="white-space-collapse: preserve;">// 로그 파일 열기</span></p> <pre _ngcontent-ng-c847612972=""> <code _ngcontent-ng-c847612972="" data-test-id="code-content" role="text">FILE *log_file = fopen("server.log", "a"); // 로그 유실 방지를 위해 라인 버퍼링으로 설정 // 버퍼는 시스템이 자동 할당(NULL), 크기는 넉넉하게 1024 setvbuf(log_file, NULL, _IOLBF, 1024); // 1KB, MAX_INPUT_LENGTH 의 두배가량 // 또는 성능을 극대화하고 싶다면 setvbuf(stdout, NULL, _IOFBF, 8192); // 8KB, MAX_STRING_LENGTH 의 절반가량 </code></pre> <hr data-path-to-node="17" /> <h3 data-path-to-node="18">⚠️ 주의할 점</h3> <ul data-path-to-node="19"> <li> <p data-path-to-node="19,0,0"><b data-index-in-node="0" data-path-to-node="19,0,0">호출 타이밍</b>: 반드시 파일을 열고 나서 <b data-index-in-node="22" data-path-to-node="19,0,0">첫 번째 입출력이 일어나기 전</b>에 호출해야 합니다. 이미 뭔가를 써버린 후에 <code data-index-in-node="64" data-path-to-node="19,0,0">setvbuf</code>를 호출하면 무시되거나 에러가 날 수 있습니다. 즉, fopen 널 처리 이후 바로 사용</p> </li> <li> <p data-path-to-node="19,1,0"><b data-index-in-node="0" data-path-to-node="19,1,0">사용자 버퍼 주의</b>: 만약 <code data-index-in-node="14" data-path-to-node="19,1,0">buffer</code> 인자에 직접 만든 <code data-index-in-node="31" data-path-to-node="19,1,0">char my_buf[1024]</code>를 넣는다면, 그 함수가 끝나기 전에 파일을 닫아야 합니다. 안 그러면 함수가 끝나서 메모리가 사라졌는데 파일 시스템은 그곳에 접근하려다 크래시가 납니다. (그래서 보통 <code data-index-in-node="143" data-path-to-node="19,1,0">NULL</code>을 씁니다.)</p> </li> </ul> <hr data-path-to-node="20" /> <h3 data-path-to-node="21">✅ 요약 및 팁</h3> <p data-path-to-node="22">머드 서버에서 <b data-index-in-node="14" data-path-to-node="22">실시간 채팅이나 명령어 결과</b>는 <code data-index-in-node="31" data-path-to-node="22">_IOLBF</code>로, <b data-index-in-node="40" data-path-to-node="22">중요한 시스템 로그</b>는 <code data-index-in-node="52" data-path-to-node="22">_IONBF, 파일 입출력에서는 </code><code data-index-in-node="0" data-path-to-node="9,1,1,0">_IOFBF </code>로 설정하는 것이 가장 궁합이 좋습니다.</p>
0
0
새글
답변
수정
삭제
최신목록
전체목록
이전 게시글이 없습니다.
DUMP 생성 프로그램 사용법
정회원 이상만 코멘트 사용이 가능합니다.
총 게시물 33개 / 검색된 게시물: 33개
setvbuf 함수
0
33
0
0
성천사
2026-01-22
DUMP 생성 프로그램 사용법
0
353
0
0
성천사
2025-06-28
컴파일러 업그레이드시 조심해야할 것
0
351
0
0
성천사
2025-06-28
C to VC6.0, VS2022 업그레이드시 오류
0
324
0
0
성천사
2025-06-28
TBAMUD 한글 아이디 저장 함수
0
402
0
0
성천사
2025-03-29
신세계 64비트 난수 처리
0
344
0
0
성천사
2025-01-01
접속금지, 접속허용 편의성 수정
0
349
0
0
성천사
2024-10-27
신세계 텍스트 출력
1
385
0
0
성천사
2024-08-06
신세계 시체생성
0
346
0
0
성천사
2024-06-12
삭제된 게시물입니다.
0
268
0
0
성천사
2024-06-12
신세계 C to VC6.0
0
493
0
0
성천사
2024-03-07
신세계 장비위치 구하기
0
344
0
0
성천사
2024-03-04
신세계 파일 존재여부 확인
0
399
0
0
성천사
2024-02-18
신세계 맙타입 전투
0
437
0
0
성천사
2023-12-02
신세계 addlog()
0
368
0
0
성천사
2023-10-25
신세계 캐릭터, 맙 이동 코드
0
405
0
0
성천사
2023-10-25
신세계 지정번호의 물건 찾기및 제거하기
0
494
0
0
성천사
2023-05-07
신세계 이동물건
1
787
0
0
성천사
2022-12-30
신세계 날씨변경 명령어
0
561
0
0
성천사
2022-12-25
[circle]
신세계 운영자 명령어 방청소
0
623
0
0
성천사
2022-10-08
1
2
다음
검색
글쓰기
최신목록
전체목록
시작일
종료일
검색어
이름
제목
내용
검색
닫기
로그인
회원가입
계정찾기
개인정보처리방침
이용약관
PC화면
Copyright (c) 텍스트머드클럽. All rights reserved.
쪽지를 전송하고 있습니다. 잠시 기다려주세요.
쪽지보내기
받는이(ID/닉네임)
닉네임으로 입력
내용
쪽지가 도착하였습니다.
쪽지함
쪽지 내용을 읽어오고 있습니다. 잠시 기다려주세요.
--