2초마다 *를 출력하는 소스에서 for(;;) 다음의 코드를 실행시키는 방법이 있나요?

yserzero의 이미지

공부하는 중에 그대로 따라서 코딩한 소스입니다.


#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
 
static void myhandler(int s) {
 char aster = '*';
 int errsave;
 errsave = errno;
 write(STDERR_FILENO, &aster, 1);
 errno = errsave;
}
 
static int setupinterrupt(void) {
 struct sigaction act;
 act.sa_handler = myhandler;
 act.sa_flags = 0;
 return (sigemptyset(&act.sa_mask) || sigaction(SIGPROF, &act, NULL));
}
 
static int setupitimer(void) {
 struct itimerval value;
 value.it_interval.tv_sec = 2;
 value.it_interval.tv_usec = 0;
 value.it_value = value.it_interval;
 return (setitimer(ITIMER_PROF, &value, NULL));
}
 
int main(void) {
 if (setupinterrupt() == -1) {
  perror("Failed to set up handler for SIGPROF");
  return 1;
 }
 if (setupitimer() == -1) {
  perror("Failed to set up the ITIMER_PROF interval timer");
  return 1;
 }
 for ( ; ;);
 printf("doing");
}

setitimer()를 이용해서 2초마다 *를 출력하고 있습니다.

main() 안에서 for ( ; ;);으로 무한루프를 돌아야만 이것이 제대로 되는 것 같습니다만,

그러면 그 아랫줄부터가 실행이 안 되지 않습니까?

그래서 질문을 드립니다. 우선 time.h의 다른 함수를 사용하지 않고 setitimer()를 사용한다는 가정하에,

1. for ( ; ;); 돌면서 그 다음의 printf("doing");을 실행하는 방법은?

2. 1번은 혹시 스레드 개념을 이용해야 하나요? 이용하지 않고 하는 방법은?

3. 이 무한루프를 종료시키는 방법은?

예를 들어 main()이라던가 myhandler() 안에서 호출하는 어떤 함수의 리턴값이 특정값을 만족할 때 종료시키고 싶은데요.

그러는 방법이 있나요?

단 여기서 종료란 exit() 등을 이용한 종료가 아니라 무한루프만의 종료를 의미합니다.

초보자라서 많이 부족합니다.

잘 몰라서 이상한 질문을 했는지도 모르겠는데 아시는 분이 있으시면 답변 부탁드립니다.

powersys의 이미지

for ( ; ;);
이건 잘못되었죠..
말그대로 무한루프 돌라는건데 빠져나올방법이 없지요.

원하시는게 아마도 일정시간을 지연시키고 싶으신거 같은데..

sleep(2); 를쓰시면 2초간지연되죠.

for( i = 1; i < 1000000 ; i++ );
뭐이런식으로.. 잠시(?)간 지연시킬수는 있는데..
원하는시간을 잡기 힘들겁니다. cpu 성능과 밀접한관계가 있죠..
더구나 좋은방법도 아닙니다..

아무튼 결론은 C 기초 책을 한번 보셔야겠습니다.

haze11의 이미지

#include ...
 
static int running = TRUE;
 
void handler(int signum)
{
  running = FALSE;
}
 
int main()
{
  signal(SIGTERM, handler);
  signal(SIGINT, handler);
 
  while (running == TRUE);
 
  printf("end\n");
 
  return 0;
}

이런식이면 되지 않을까요? =.=

galien의 이미지

아아.. 컴파일러가 똑똑하지 않으면

아무 일도 하지 않으면서 CPU가 혹사 당하겠군요..

눈물이 앞을 가립니다....

genichin의 이미지

글로벌 변수를 하나 만드시고

static int loop_flag = 1;

for(;;)대신

while(loop_flag) usleep(100000);

를 쓰시면 되지 않을까요???

그리고 usleep을 넣지 않으면 CPU가 지쳐 버릴거 같은데..ㅋㅋ

혹 글로벌 변수를 싫어하시나요?????ㅋㅋ

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

위에분이 쓰셨네...ㅋㅋ

댓글 어떻게 지우나요??

yserzero의 이미지

답변 주신 분들 감사드립니다.
그런데 제가 질문한 내용이 부족했던 것 같은데, 제가 원하는 것은 위의 소스처럼 sigaction과 setitimer()을 이용하여 2초마다 *를 출력하는데 꼭 for(;;)처럼 무한루프를 사용하여야 하는가?에 관한 것입니다.
위의 소스는 책 예제를 따라한 것입니다.
만약 무한루프를 사용하지 않으려면 어떻게 해야 하나?,
POSIX 타이머는 무한루프를 사용할 수 밖에 없나?가 제가 궁금한 것입니다.

acekila의 이미지

질문하신 것을 아래와 같이 두가지로 요약해보겠습니다.
1. 타이머가 한 주기를 돌 때까지 기다리는 동안 무한 루프를 돌면서 기다려야 하는가?
2. 특정 조건을 만족하는 경우 무한 루프를 빠져 나오게 할 수 있는가?

1번: setitimer에서 사용 가능한 타이머는 세 종류가 있으며, 타이머가 만료됐을 때 전달하는 signal도 각각 다릅니다.
예제에서 사용한 ITIMER_PROF는 프로세스가 실제 실행 되는 동안에만 타이머가 작동하기 때문에 무한 루프를 돌려서 프로세스를 실행 상태로 만들어야 했을 것입니다.
man setitimer를 참고하셔서 다른 타이머(실제 시간을 기준으로 하는)를 사용하실 경우에는 sleep()등으로 프로세스가 종료하지 않도록 조건만 만들어 주시면, 타이머가 주기를 돌 때마다 myhandler를 호출 할 것입니다.

2번: 무한 루프를 빠져 나오는 방법은 윗 분들이 이미 설명하셨으므로 넘어가겠습니다.

1번과 2번을 잘 조합해서 소스 코드를 수정해보시면 되겠습니다.

댓글 달기

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