APUE 2 오류 기록

14 년 5 월 에 APUE 2 의 신호 처리 장 을 보고 '10.10 alarm 과 pause 함수' 를 보 았 을 때 그 중 하 나 는 '시간 초과 기능 의 read 함수' 였 다.나 는 당시 에 이 코드 를 시험 해 보 았 지만 시간 초과 기능 이 없 었 고 chinaunix 포럼 에 질문 게시 물 (링크:http://bbs.chinaunix.net/thread-4135617-1-1.html)。
   구체 적 인 코드 는 다음 과 같다.
 
#include 
#include 
#include 

void sig_alarm(int )
{
    printf("==========alarm clock!==============
"); } void test_alarm() { alarm(3); char buf[1024] = {0}; int len = read(STDIN_FILENO,buf,1024); alarm(0); printf("test alarm succed!
"); } int main() { signal(SIGALRM,sig_alarm); test_alarm(); return 0; }

다음은 gdb 정보 입 니 다.
 
 
[knull@knull sock_raw]$ gstack 5212
#0  0x009b0424 in __kernel_vsyscall ()
#1  0x00c0c8c3 in __read_nocancel () from /lib/libc.so.6
#2  0x08048563 in test_alarm() ()
#3  0x080485aa in main ()

 
 
     오늘 은 또 신호 처 리 를 보고 '다시 들 어 갈 수 있 는 함수' 와 'alarm 과 pause 함수' 두 장 을 보 았 습 니 다. 갑자기 이 문 제 를 생각 하고 생각 한 끝 에 그 중의 오묘 함 을 깨 달 았 습 니 다.
     "시간 초과" read 함수, 절 차 는 다음 과 같 습 니 다. 1. alarm (3) 이후 read 를 호출 하여 거기에 막 습 니 다.2. 3 초 후에 alarm 신호 가 발생 하여 등 록 된 사용자 정의 신호 처리 함수 에 도착 합 니 다.3. 신호 처리 함수 가 끝 난 후에 read 는 다시 들 어 갈 수 있 는 시스템 호출 함수 이기 때문에 다시 read 의 시스템 호출 에 돌아 갑 니 다.결론: 상기 코드 는 '시간 초과 기능 을 실현 하 는 read 함수' 이지 만 시간 초과 효과 에 이 르 지 못 했다.그래서 이 코드 의 예 자체 가 틀 렸 다.(가능 합 니 다. 첫 번 째 버 전 일 때 read 는 다시 들 어 갈 수 있 는 함수 가 아 닙 니 다. 그러나 후기 두 번 째 버 전 일 때 read 는 다시 들 어 갈 수 있 는 함수 에 추가 되 었 으 나 해당 하 는 코드 는 수정 되 지 않 았 습 니 다) 참고: APUE 2 - 10.6: 다시 들 어 갈 수 있 는 함수;         APUE 2 - 10.10: alarm 과 pause 함수;중간 에 시간 초과 read 함수 코드 예 가 있 습 니 다.

좋은 웹페이지 즐겨찾기