setitimer 질문이요

harisoo의 이미지

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <string.h>
#include <signal.h>
 
#define TRUE 1
#define FALSE 0
 
#define PRINT_CTIME 0
 
void ptimer_handler(int signal)
{
	time_t now;
	if(signal == SIGPROF)
	{
#if PRINT_CTIME
		now = time(NULL);
		printf("get sig prof alarm:%s\n",ctime(&now));
#else
		printf("get sig prof alarm\n");
#endif
	}
}
 
void vtimer_handler(int signal)
{
	time_t now;
	if(signal == SIGVTALRM)
	{
#if PRINT_CTIME
		now = time(NULL);
		printf("get sig vt alarm:%s\n",ctime(&now));
#else
		printf("get sig vt alarm\n");
#endif
	}
 
}
 
void timer_handler(int signal)
{	
	time_t now;
	if(signal == SIGALRM)
	{
#if PRINT_CTIME
		now = time(NULL);
		printf("get sig alarm:%s\n",ctime(&now));
#else
		printf("get sig alarm\n");
#endif
	}
}
 
int risoo_prof_alarm(struct timeval *data)
{
	struct itimerval timer,old;
 
	memcpy(&timer.it_value,data,sizeof(struct timeval));
	timer.it_interval.tv_sec = 0;
	timer.it_interval.tv_usec = 0;
 
	if(setitimer(ITIMER_PROF,&timer,&old) < 0)
	{
		perror("setitimer() ");
		return FALSE;
	}
	return TRUE;
}
 
int risoo_vt_alarm(struct timeval *data)
{
	struct itimerval timer,old;
 
	memcpy(&timer.it_value,data,sizeof(struct timeval));
	timer.it_interval.tv_sec = 0;
	timer.it_interval.tv_usec = 0;
 
	if(setitimer(ITIMER_VIRTUAL,&timer,&old) < 0)
	{
		perror("setitimer() ");
		return FALSE;
	}
	return TRUE;
}
 
int risoo_real_alarm(struct timeval *data)
{
	struct itimerval timer,old;
 
	memcpy(&timer.it_value,data,sizeof(struct timeval));
	timer.it_interval.tv_sec = 0;
	timer.it_interval.tv_usec = 0;
 
	if(setitimer(ITIMER_REAL,&timer,&old) < 0)
	{
		perror("setitimer() ");
		return FALSE;
	}
	return TRUE;
}
 
int main(void)
{
	struct timeval timer;
 
	signal(SIGVTALRM,vtimer_handler);
	signal(SIGPROF,ptimer_handler);
	signal(SIGALRM,timer_handler);
 
	timer.tv_sec = 0;
	timer.tv_usec = 500000;
	if(!risoo_vt_alarm(&timer))
	{
		printf("set vt alarm fialed\n");
		return 0;
	}
	printf("set vt alarm ok\n");
 
	if(!risoo_prof_alarm(&timer))
	{
		printf("set prof alarm fialed\n");
		return 0;
	}
	printf("set prof alarm ok\n");
 
 
	if(!risoo_real_alarm(&timer))
	{
		printf("set real alarm fialed\n");
		return 0;
	}
	printf("set real alarm ok\n");
 
	while(1);
	return 0;
}

setitimer()을 공부하던중 이상한점이 발견되어서 문의 드립니다.

setitimer()에서 flag를 설정가능한것이 3가지가 있는걸로 알고 있습니다.

이 3가지는 각각 다른 시그널을 발생시키는걸로 알고 잇고요.

그래서 3가지를 각각 호출하면 시그널이 어떻게 나오는지 실험해보려고

제가 테스트 코드를 만들어서 햇는데 결과가 이상하게 나오네요

3개 다 호출하면 SIGVTALRM이 한번더 호출되더군요 이상하게..

그래서 ITIMER_PROF가 ITIMER_REAL과 ITIMER_VIRTUAL을 섞어서 쓰기 때문에

그런가 싶어서 ITIMER_REAL를 제외하고 실행시켯는데 안그렇더군요..

또한 특이한것은 시그널이 발생할때마다 시간을 출력시키도록하면

그런경우가 없어집니다.

이렇게 나오는게 정상인가요? 조언부탁드립니다.

File attachments: 
첨부파일 크기
Plain text icon setitimer.c2.23 KB
sunyzero의 이미지

제 시스템에서 작동시켜보니 두번 발생하거나 하지 않습니다.

그리고 예제와는 상관없지만, signal(2) 함수는 호환성때문에 사용을 권장하지 않는 함수입니다.
되도록이면 sigaction(2) 으로 바꾸시는게 좋습니다.
========================================
* 부분이 전체를 대변하는 하나의 속성일때 진리이다.
영속적이지 못한 것은 전체가 될 수 없다.

========================================
* The truth will set you free.

harisoo의 이미지

그건 그렇고 signal()함수가 호환성이 안좋은가요?

gnu소스 대부분이 signal()함수를 사용하던데....

왜 안좋은지 설명좀 부탁드릴게요..

sunyzero의 이미지

man signal 로 보시면 됩니다. 원래 signal 함수는 옛날 유닉스에서 전해온 함수이며
플랫폼에 따라서 1회성으로 사용되는 경우도 있습니다. (SA_SIGONESHOT 플래그와 동일)

그렇기 때문에 IEEE 1003.1 표준안에서는 signal()부분을 보면

The sigaction() function provides a more comprehensive and reliable mechanism for controlling signals; new applications should use sigaction() rather than signal().

이라고 되어있습니다. 따라서 앞으로는 sigaction()을 쓰시는게 더 좋을겁니다.
========================================
* 부분이 전체를 대변하는 하나의 속성일때 진리이다.
영속적이지 못한 것은 전체가 될 수 없다.

========================================
* The truth will set you free.

댓글 달기

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