[질문] 이상한 현상... 궁굼해요 알려주세요..

iamlow의 이미지

자 간단한 예제입니다.

int main(void)
{
for(;;) {
printf("*");
// fflush(stdout);
// sleep(1);
}

return 0;
}

위 프로그램을 실행시키면 화면에 별표가 계속찍힙니다.

그런데 위 프로그램에서 sleep(1)의 주석을 제거하면??

화면에 *를 찍지 않습니다.
그러다 Ctrl+C를 해주면 찍힙니다~~

그리고 fflush(stdout)의 주석을 제거하면 찍히구요...

왜 플러쉬를 하면 찍히고 안하면 안찍을까요??

왜 그런건가요?? 도데체 printf와 sleep과 무슨 관계가 있는건가요?

int main(void)
{

for(;;) {
printf("*");
fflush(stdout);
sleep(1);
}

return 0;
}

irondog의 이미지

전 아랫 소스 코드도 '*'문자 출력 잘 하는데요.

pynoos의 이미지

이것이 버퍼링하는 I/O의 장점이자, 처음 당하는 사람들에게는 뒤통수입니다. :)
write 시스템 콜을 줄여주거든요.

kfmes의 이미지

pynoos wrote:
이것이 버퍼링하는 I/O의 장점이자, 처음 당하는 사람들에게는 뒤통수입니다. :)
write 시스템 콜을 줄여주거든요.

지난학기 수업시간에 모 교수님께서 하신말씀이 생각나는군요 :)

----------------------------------------

doldori의 이미지

iamlow wrote:
왜 그런건가요?? 도데체 printf와 sleep과 무슨 관계가 있는건가요?

별로 관계 없습니다. 문제는 printf()가 버퍼를 이용하기 때문입니다. 효율을 높이기
위해 출력할 글자가 생길 때마다 바로 출력하는 것이 아니라 버퍼에 쌓아놨다가
버퍼가 차면 한꺼번에 출력하기도 하거든요. fflush()는 강제로 버퍼에 있는 내용을
출력하는 것이고요.
버퍼링을 원하지 않는다면 setvbuf()로 조정을 하든지 버퍼링을 하지 않는 stderr로
출력하면 됩니다.
iamlow의 이미지

답변 감사드립니다. 그런데..

별로 관계가 없으면

int main(void)
{
for(; {
printf("*");
// sleep(1);
}

return 0;
}

위와같이 실행하거나

int main(void)
{
for(; {
printf("*");
sleep(1);
}

return 0;
}
이렇게 실행하거나 똑같이 화면에 뿌려야 되는게 정상 아닙니까?
다만 1초의 딜레이가 생긴다는 것을 제외하고는 말입니다.
그런데 sleep(1)은 화면에 *을 찍지 못한단 말이죠...

다시한번 명확한 답변을 부탁드립니다.

irondog의 이미지

doldori wrote:
iamlow wrote:
왜 그런건가요?? 도데체 printf와 sleep과 무슨 관계가 있는건가요?

별로 관계 없습니다. 문제는 printf()가 버퍼를 이용하기 때문입니다. 효율을 높이기
위해 출력할 글자가 생길 때마다 바로 출력하는 것이 아니라 버퍼에 쌓아놨다가
버퍼가 차면 한꺼번에 출력하기도 하거든요. fflush()는 강제로 버퍼에 있는 내용을
출력하는 것이고요.
버퍼링을 원하지 않는다면 setvbuf()로 조정을 하든지 버퍼링을 하지 않는 stderr로
출력하면 됩니다.

다시 한번 답이 됐기를... -

송효진의 이미지

sleep(1) 이 없을 경우 속도조절을 안합니다.
즉 순식간에 일정량이 버퍼에 쌓여서 화면에 보여주는거죠.
버퍼에 쌓지 않는것이 아닌 것입니다.

usleep(100) 정도로 해서 조금 기다리시면 fflush() 없이도 화면에 나오는것을 확인하실 수 있을겁니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.