alarm 함수
조회수 432회
질문이 있습니다. 원하는 값은 5초간 매초 running...이 작성이 되는 것인데 이렇게 코드를 작성을 하고 이름이 alarm.c일 경우 ./alarm 5를 하면 *argv[1]값에 5가 들어가고 실행을 시킨다면 메인함수에서 alarm(*argv[1])을 통해 5초 뒤에 signal에 SIGALARM이 실행되어 sig함수로 넘어가서 exit(0)을 통해 종료가 되는것 아닌가요? 왜 실행을 시키면 running이 계속해서 나오고 종료가 안됩니다...
include stdio.h
include stdlib.h
include signal.h
include unistd.h
void sig(int signal)
{
exit(0);
}
int main(int argc, char *argv[])
{
signal(SIGALRM, sig);
alarm(*argv[1]);
while(1){
printf("running...\n");
sleep(1);
}
return 0; }
1 답변
-
alarm(unsigned)는 호출 인자로 부호없는 정수를 입력 받습니다.
*argv[1]
는 char로 정수 취급됩니다../alarm 5
로 실행할 경우 정수 5가 아닌'5'
에 대한 이스키 코드 53이 됩니다.즉,
alram(*argv[1])
은 53초 후 시그널을 발생합니다.따라서 다음과 같이 문자열을 정수로 변환해 주는 과정을 통해 호출해야합니다.
int main(int argc, char *argv[]) { int timeout = atoi(argv[1]); if (timeout < 0) return -1; signal(SIGALRM, sig); alarm((unsigned) timeout);
첨언으로 시그널 핸들러에서
exit()
를 사용하면 안됩니다. 다음 링크를 참고해보세요.https://en.cppreference.com/w/c/program/signal#Signal_handler
댓글 입력