27.08.2015 Views

리눅스 시스템 프로그래밍-미리보기

커널과 C 라이브러리로 풀어가는(개정2판) 로버트 러브 저/김영근 역 | 한빛미디어 | 2015년 01월 35,000원

커널과 C 라이브러리로 풀어가는(개정2판)
로버트 러브 저/김영근 역 | 한빛미디어 | 2015년 01월
35,000원

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

nr = write (fd, buf, strlen (buf));<br />

if (nr == -1)<br />

/* 에러 */<br />

하지만 여기서도 read()와 마찬가지로 이런 구현 방법이 아주 정확하지는 않다. 호출자는 또<br />

한, 다음과 같이 부분 쓰기가 일어났을 가능성도 점검할 필요가 있다.<br />

unsigned long word = 1720;<br />

size _t count;<br />

ssize _t nr;<br />

count = sizeof (word);<br />

nr = write (fd, &word, count);<br />

if (nr == -1)<br />

/* 에러, errno를 확인하자 */<br />

else if (nr ! = count)<br />

/* 에러일 가능성이 있지만, errno는 설정되지 않음 */<br />

2.3.1 부분 쓰기<br />

write() <strong>시스템</strong> 콜은 read() <strong>시스템</strong> 콜에서 발생하는 부분 읽기와 비교해서 부분 쓰기를 일<br />

으킬 가능성이 훨씬 적다. 또한, write()에는 EOF 조건도 없다. 일반 파일에 대한 write()<br />

는 에러가 발생하지 않을 경우 요청받은 전체 쓰기 작업 수행을 보장한다.<br />

따라서 일반 파일을 대상으로 쓰기 작업을 수행할 경우에는 루프 내에서 돌릴 필요가 없다. 하<br />

지만 (소켓과 같은) 다른 파일 유형을 대상으로 쓰기 작업을 수행할 경우에는 요청한 모든 바<br />

이트를 정말로 썼는지 보장하기 위해 루프가 필요할지도 모른다. 루프를 사용하면서 얻는 또<br />

다른 장점은 두 번째 write() 호출이 숨어 있던 에러 코드를 반환할 가능성이다. 여기서 에러<br />

코드는 첫 번째 write() 호출 결과로 부분 쓰기를 일으킨 원인을 밝혀줄 수도 있다(물론 이런<br />

상황이 자주 발생하지는 않는다). 다음 예를 살펴보자.<br />

ssize _t ret, nr;<br />

while (len != 0 && (ret = write (fd, buf, len)) != 0) {<br />

if (ret == -1) {<br />

76 <strong>리눅스</strong> <strong>시스템</strong> <strong>프로그래밍</strong>

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!