我已經看到至少有三種不同的方法來爲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'd內存出現在我們的泄漏檢測中。 –