시스템콜은 빠르다..

dragem의 이미지

printf("aaa");
read(0, buf, sizeof(buf));

이 코드를 실행해 보면 printf는 수행이 안되는데..

왜 그런거죠??

cdecl의 이미지

출력 버퍼가 안비워 진거 같군요

printf문 다음에 fflush(stdout);를 하시던가
아니면 printf("aaa\n"); 뒤에 개행을 줘보십시요.

출력버퍼가 비워질때는
1. 개행을 만났을때
2. 강제적으로 비울때
3. 입력을 만났을때
입니다.

--
cdecl

--
cdecl

IsExist의 이미지

printf ("aaa"); 
fflush (stdout);
...

로 해보세요.

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

doldori의 이미지

출력 버퍼가 차지 않아서 그럴 수 있습니다. 강제로 출력하게 하려면

printf("aaa");
fflush(stdout);

하면 됩니다.

dragem의 이미지

답변 감사합니다..^^;

그런데, 이런일이 왜 생기는 건가요?

혹시 참고할 문서가 있나요?

정태영의 이미지

dragem wrote:
답변 감사합니다..^^;

그런데, 이런일이 왜 생기는 건가요?

혹시 참고할 문서가 있나요?

Advanced Programming in the UNIX Environment 책에 보면..
관련된 내용이 나옵니다..

stdout 은.. 버퍼링을 하기 때문에.. 개행문자를 만나거나 버퍼가 꽉차기전엔 출력이 전혀 없고....
stderr 은.. 버퍼링을 전혀 하지 않고..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

익명 사용자의 이미지

주제를 "시스템콜은 빠르다.."라고 하셨는데요,
상대적이겠지요?!
그럼 누구보다? 당연히 라이브러리입니다.
라이브러리도 결국 IO를 수행하기 위해 시스템호출을 사용하게되겠지요.
write()는 시스템 호출이고, *printf()시리즈들은 전부 라이브러리입니다.
라이브러리들은 대체로 버퍼링 루틴을 자신이 가지고 있으며,
이로 인한 behavior의 변화에서 오류를 발생시키기 쉽습니다.
따라서, 대체로 시스템호출을 이용한 프로그래밍이 라이브러리를 이용한
프로그래밍보다 나을 수 있습니다.
아니면, 라이브러리의 내부 동작을 100% 이해하고 사용해야
보다 튼튼한(robust;safe;secure) 코드를 짤 수 있습니다.

progcom의 이미지

속도에서 관해서는 관련 글타래가 많이 있을텐데...
시스템 호출은 '그 호출' 자체는 빠르지만, 전체적인 프로그램 상에서도 빠르다고 할 수는 없습니다. 특히나 파일 입출력 등이 자주 일어난다면 표준 라이브러리가 어중간하게 시스템 콜을 난무하는 것보다 전체적인 성능에서 많이 차이가 납니다.

그리고 대체로 표준 라이브러리를 이용한 프로그래밍이 시스템 콜을 마구하는 프로그램보다 좋습니다. 시스템 콜이라는건 시스템(OS 등)마다 일부 차이가 날 수 있는겁니다. 표준 라이브러리의 behavior는 규격으로 일정하게 정해져 있는 것이고, 이런건 변화가 없습니다. (출력 버퍼링은 표준 라이브러리의 규격입니다) 오히려 차이가 난다면 시스템 콜이지요. (물론 read() 같은 POSIX 표준 시스템 콜은 크게 문제가 없습니다)

단순히 자신의 머신에서 최고의 속도를 얻기 위해서라면 시스템 콜을 활용해서 복잡한 코드를 짜는게 좋습니다만... (필요한 부분에 직접 버퍼링 구현을 한다던지...)

dragem의 이미지

와.. 질문 하나로..많은걸 얻게 되네요^^

너무 기분 좋네여~ 답변다신분들 감사합니다~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.