[질문] while ( !sleep(1) ) { ... } 어떻게 생각하십니까?

오호라의 이미지

1번

while( !sleep(1) )
{
    ... 
}

2번

while( 1 )
{
    sleep( 1 );
    ...
}

둘은 똑같은가요?
1번을 쓰니까. 다른 분들이 의아해 하시더군요. 이게 뭐냐?

SLEEP(3)            Linux Programmer's Manual            SLEEP(3)
 
NAME
       sleep - Sleep for the specified number of seconds
 
...
 
RETURN VALUE
       Zero  if  the requested time has elapsed, or the number of
       seconds left to sleep.
...

개인적인 생각으로는 1번이 좀더 애매모호하지만 좀더 테크닉한거 같은데 아닌가요?
코딩도 대중성을 따라하는 것인지...ㅠㅠ

sloth_의 이미지

좀더 애매모호한것은 확실하군요;;
주위분들이 의아해했다구 하시니 더욱,,
될수있으면 최대한 많은 사람들이(바보라 하더라도) 명확하게 알아볼수 있는 스타일이 좋겠지요

ssif의 이미지

1번은 sleep()의 리턴값이 상황에 따라 다르기 때문에
int형으로 0부터 다양하게 나올겁니다.
아마도 while()에 이렇게 나올거라 예상합니다.

1.while(0)
2.while(1)
3.while(2)
4........
(자다가 남은 시간이 리턴됨.....)

그때그때 달라요가 되겠죠.

2번은 루플를 돌다가 sleep()를 호출해서 지정된 시간만큼 아마도 잠을(??) 자겠죠.
프로그래머가 의도하는 바가 분명하죠.

제게는 그렇게 보입니다.
봄들판에서다

봄들판에서다

cppig1995의 이미지

!sleep(1)이므로 결과는 0이거나 1입니다. 다시 코드를 살펴보십시오.

큰 상관은 없지만 참고할만한 테크닉: !!x (x가 0이나 1이 아니면 x를 1로 만든다.)

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

jg의 이미지

그대로 읽으면 '1초 쉬지 않을 동안' 이라서
그런지 코드가 와닿지가 않네요.

$Myoungjin_JEON=@@=qw^rekcaH lreP rehtonA tsuJ^;$|++;{$i=$like=pop@@;unshift@@,$i;$~=18-length$i;print"\r[","~"x abs,(scalar reverse$i),"~"x($~-abs),"]"and select$good,$day,$mate,1/$~for 0..$~,-$~+1..-1;redo}

cppig1995의 이미지

큭큭
그런 면에서는 DOS의 conio 라이브러리에서 많이 쓰는 while(!kbhit())이 while(!cond) 형태에서는 꽤 직관적인 거로군요.
(말고 좋은 예 생각나는 게 없군요.)

생각할 거리 많은 스레드라서 띄워 봅니다.

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

grassman의 이미지

취미로 만드는 프로그램에 남들이 뭐라할 이유는 없으니까요.
자신만 알아볼 수 있으면 되는거죠.
다만 회사에서 코딩할 때는 좀 더 직관적으로 알아볼 수 있게 코딩하는게 좋을 듯 합니다. 다른 사람들이 봐야 하는 코드에서 예술(?) 코딩은 도리어 코드를 설명하는 시간만 늘리는 결과를 초래합니다.

익명 사용자의 이미지

그냥 쓰시면되요. 가독성에 별 문제 없어 보이는군요.

익명 사용자의 이미지

"테크닉"하다는 게 어떤 의미인지는 모르겠지만,

1. "이 인간 코드를 비비 꼬아놨네?" 하고 지나가던 사람이 한번 감탄(?)하게 만든다던가,
2. "우씨, sleep의 결과값이 도대체 뭐야?" 하고 테크니컬 매뉴얼을 다시 뒤져보게 만드는 효과가 있겠습니다.

그리고 첫번째와 두번째의 코드는 분명 다릅니다. sleep은 중간에 signal이 발생하면 sleep하지 않은 시간을 돌려준다고 하네요. 즉 sleep을 하려고 하는 순간 signal이 발생하면 1을 리턴할 가능성이 있습니다.

첫번째 코드는 명시적으로 "sleep을 하려고 하는 순간 signal이 발생하는 백만분의 1 확률 상황을 나는 캐치하고 싶다. 이 경우에만 while loop를 끝내라!"라고 요구하는 코드입니다. "sleep의 결과값이 이러이러하므로 이런 뜻이다."라고 주석을 달아 두는 것이 좋겠습니다. 두번째 코드와는 전혀 의미가 다릅니다.

첫번째 코드를 짜면서 두번째의 동작을 원하셨다면 애매모호하면서 untechnical, unmaintainable한 코드라고 해야겠습니다. (이른바 테스트할 때에는 항상 잘 돌다가 고객 코앞에서 터지는 코드...)

오호라의 이미지

그러나, 결과는 1번으로 고치라는...ㅋㅋㅋ

말씀하신 내용이 제가 의도한 봐입니다.

그리고 첫번째와 두번째의 코드는 분명 다릅니다. sleep은 중간에 signal이 발생하면 sleep하지 않은 시간을 돌려준다고 하네요. 즉 sleep을 하려고 하는 순간 signal이 발생하면 1을 리턴할 가능성이 있습니다

정확하게 1초동안 슬립하지 않으면 오작동을 할수 있겠지요. 뻗는다( core ) vs 부작용 ( side efftect )

(이른바 테스트할 때에는 항상 잘 돌다가 고객 코앞에서 터지는 코드...)

물론 마지막엔 시그널처리해서 나갑니다. 혹시나 테스트환경시 이상한 시그널이나, 기타 다른 데몬이나 프로그램에 영향을 받지 않을까해서 써본 이유와 완벽하지는 않지만, 어느정도 [확정된 1초]를 쉬기 위함이죠.

아무튼 두세가지 이유로 저런 야스무리한 코드를 썼습니다. ^^;

Hello World.

Fe.head의 이미지

이건 어떠세요?

for( ; ; sleep(1) ) {
 ...
}

-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐?
그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

ymir의 이미지

코드는 가급적 '의도가 명확히 드러나도록' 작성하시는게 좋습니다.
명세서와 코드가 일치하도록, 그리고 누가 와서 봐도 쉽게 이해할 수 있도록...

명세서에 루프의 탈출 조건을 sleep(1) 의 실패(?)를 내걸었다면..
1번이 타당하겠지만..
그렇지 않다면, 오히려 의도를 이해하기 어렵게 만드는 코드일 뿐이고..
(의도가 주석등으로 명확히 기술되지 않았다면, 이 코드를 보는 사람은 2번을 떠올리면서
왜 이렇게 짰을까? 하고 궁금해 하겠죠..)

더구나, 예측 불가능한 상태를 탈출 조건으로 거는 것은..
코드의 불확실성을 높이기만 할 뿐, 운용이나 디버깅 등에는 좋지 않다고 봅니다..

불완전 sleep 의 검출이 필요한 케이스라 하더라도, 가급적 루프내 에서 검출해서..
에러처리하고 명시적으로 루프를 벗어나도록 작성하는 것이 어떨까 합니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

댓글 달기

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