나는 sigaltstack에 대한 대안 스택을 설정하기 위해 적어도 세 가지 다른 접근법을 보았다. 나는 하나가 가장 좋은 방법이다 궁금 해요 :sigaltstack을 올바르게 설정하는 방법은 무엇입니까?
접근 # 1
stack_t sigstk;
sigstk.ss_size = 0;
sigstk.ss_flags = 0;
sigstk.ss_sp = mmap (NULL, SIGSTKSZ, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
if (sigstk.ss_sp != MAP_FAILED) {
sigstk.ss_size = SIGSTKSZ;
if (sigaltstack (&sigstk, 0) < 0) {
sigstk.ss_size = 0;
printf ("sigaltstack errno=%d\n", errno);
}
} else {
printf ("malloc (SIGSTKSZ) failed!\n");
}
접근 # 2 (우리는 잠시 동안을 사용하고 있지만, 여기에 할당 된 메모리가 누수 탐지에 표시 합니다 ('누출'명령))
stack_t sigstk;
sigstk.ss_size = 0;
sigstk.ss_flags = 0;
sigstk.ss_sp = malloc (SIGSTKSZ);
if (sigstk.ss_sp != NULL) {
sigstk.ss_size = SIGSTKSZ;
if (sigaltstack (&sigstk, 0) < 0) {
sigstk.ss_size = 0;
free (sigstk.ss_sp);
printf ("sigaltstack errno=%d\n", errno);
}
} else {
printf ("malloc (SIGSTKSZ) failed!\n");
}
접근 # 3
stack_t sigstk;
static char ssp[SIGSTKSZ];
sigstk.ss_size = SIGSTKSZ;
sigstk.ss_flags = 0;
sigstk.ss_sp = ssp;
sigstk.ss_size = SIGSTKSZ;
if (sigaltstack (&sigstk, 0) < 0) {
sigstk.ss_size = 0;
free (sigstk.ss_sp);
printf ("sigaltstack errno=%d\n", errno);
}
감사합니다 , Ákos (Mac OS X 10.8.2)
제 3의 접근법에서 '정적'스토리지 클래스 지정자는 변수가 범위를 벗어나는 것을 허용하지 않습니다. –
아, 정적 규정자를 알지 못했습니다. 명확히 해 주셔서 감사합니다. 이 경우 모든 접근법이 다소 유효하고 개인적인 취향에 달려 있습니다. 아니면 특정 접근법에 특정 문제가 있습니까? –
예.우리는 현재 두 번째 방법을 사용하고 있지만, malloc 된 메모리가 누수 탐지에 나타납니다. –