APUE 2 오류 기록
구체 적 인 코드 는 다음 과 같다.
#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 함수 코드 예 가 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WSL 이 윈도 폴 더 에서 오른쪽 단 추 를 눌 러 서 여기 서 Ubuntu (Linux) 를 엽 니 다.요약 이 맞 는 지 확인 하고 싶 은 것 을 다운 받 았 습 니 다. 하지만 cmd 는 이 작은 도구 가 없어 서 Ubuntu 로 보조 할 수 밖 에 없 었 습 니 다. 2. 레 지 스 트 에 있 는 이 폴 더 计算...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.