Mac OS에서 C 프로그램을 실행했습니다. 내 프로그램의 일부는 다음과 같습니다. 이 코드는 sigint 신호에서 잘 실행되지만 sigkill 신호에서는 작동하지 않습니다. 나는의 printf에서 볼 수있는, 그것은 함수 SIGINT()를 입력하고 플래그 값을 변경할 수 있습니다, 내가 sleep(1)
를 작성하지 않은 처음에는C에서 linux, signal 및 sleep()을 루프에 넣음
:
void sigkill(int sig){ /*some code neglected*/ exit(0); } void sigint(int sig){ flag=1; } void alive(void) { signal(SIGINT, sigint); signal(SIGKILL, sigkill); alarm(10); while(1){ //printf("%d\n",flag); sleep(1); if(flag==1){ printf("no\n"); flag=0; } } }
나는 네 가지 질문이 있습니다. 그러나 내가 예상 한대로 "아니오"출력이 없습니다.
수면 기능을 추가 한 후 잘 작동합니다. 나는 while 루프가 1 초마다 플래그를 검사하고, flag = 1이면 "no"를 출력한다고 가정합니다. 그러나 Ctrl + c를 누를 때마다 매번 "아니오"출력으로 보입니다. 왜 1 초를 기다리지 않습니까?
"잠깐 기다리려면 'sleep()'을 사용하지 말고 loop()와 함께 alarm()을 사용하십시오." sleep()없이 구현하는 방법을 알고 싶습니다.
kill 명령은 sigkill 함수를 호출 할 수 없습니다. 어떻게 수정합니까? 이 커널에 시스템 호출을 할 때 일반적으로
'SIGKILL'기간을 트래핑 할 수 없습니다. 'SIGKILL'에 대한 트랩을 설정할 수 없습니다. 덧붙여 말하면'SIGSTOP '. –
sleep()을 사용하지 않고 구현하는 방법을 알고 계십니까? –
'alarm()'과'sleep()'을 섞는 것이 100 % 신뢰할 만하지 않습니다. 'alarm()'과'pause()'를 사용할 수 있습니다 -'pause()'는 인터럽트되고 시그널 핸들러가 리턴 될 때만 리턴합니다. 잠깐 잠을 자려면'select()'와'poll()'과 플랫폼 특정 변형을 사용할 수 있습니다. 'nanosleep()'과'usleep()'을 사용하면 나노초와 마이크로 초 해상도의 수면을 할 수 있습니다 (정확도는 일반적으로 해상도만큼 좋지 않습니다). 당신이 열심히 보면 어딘가에 수백 초의 수면이있을 것입니다. –