2011-12-14 4 views
12

다음은 매우 기본적인 질문입니다. 교수님의 강의 슬라이드에는 실제로 얻지 못하는 예가 있습니다.C 표준 I/O 대 UNIX I/O 기본

printf("u"); 
write(STDOUT_FILENO, "m", 1); 
printf("d\n"); 

을 ... 그리고 그녀는이 코드의 넣어 밖으로 될 것이라고 말했다 :

그녀는 썼다

진흙

나는 그것을 얻지 않는다. 그래서 왜 이런 일이 일어 났는지 이해하면 제게 설명해주십시오. . (제 마지막 슬라이드 페이지)

기준이 질문

http://lagoon.cs.umd.edu/216/Lectures/lect17.pdf 

기본적

답변

20

write은 시스템 호출입니다.이 파일은 사용자 모드 (실행중인 프로그램)와 운영 체제 커널 (바이트가 파일에 기록 될 때 디스크에 실제로 쓰는 것을 처리하는) 사이의 인터페이스에 의해 구현됩니다.

printf은 C 표준 라이브러리 함수로, 사용자 모드 프로그램에로드 된 라이브러리 코드로 구현됩니다.

C 표준 라이브러리 출력 함수는 기본적으로 줄 끝까지 출력을 버퍼링합니다. 버퍼가 가득 차거나 개행 문자로 종료되면 라이브러리 구현에서 write을 호출하여 파일에 기록됩니다.

따라서 printf을 통한 출력은 즉시 운영 체제 write으로 전송되지 않습니다. 귀하의 예제에서, 당신은 편지 'u'를 버퍼링 한 다음 즉시 'd'를 버퍼에 추가하고 표준 라이브러리가 호출을합니다. write(STDOUT_FILENO, "ud\n");

+0

+1입니다. – hari

+0

나는 그것을 얻었다, 고마워! –

10

, stdout는 라인 버퍼 단계; 개행 문자가 발생할 때까지 (또는 버퍼가 채워질 때까지) 출력으로 플러시되지 않습니다.

따라서 "u""d\n"이 수신 될 때까지 버퍼에 앉습니다. 그러나 write은이 버퍼를 바이 패스합니다.

+0

나는 "subverts "아무것도. 버퍼가 손상되지 않고 올바르게 작동합니다. 보다 정확하게는 write는 시스템 호출이고 printf는 라이브러리 함수입니다. –

+0

@Heath : "바이 패스"! –

+2

기본적으로 stdout은 * 기본적으로 * 줄 바꿈이 아닙니다. * stdout이 tty와 연관되어 있다면, 기본적으로 라인 버퍼링을한다. stdout이 일반 파일이거나 파이프 (또는 실제로 tty가 아닌 다른 파일)이면 기본적으로 버퍼링됩니다. –