5

sigaltstack()の代替スタックをセットアップするための少なくとも 3 つの異なるアプローチを見てきました。私はどれが最良のアプローチであるか疑問に思っています:

アプローチ #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 (しばらくこれを使用してきましたが、ここで割り当てられたメモリがリーク検出 (leaksコマンド) に表示されます)

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)

4

3 に答える 3

1

についてはあまり詳しくありませんが、man ページsigaltstack()を確認しています。あなたの 3 つのアプローチの違いは、構造体メンバーにスペースを割り当てる方法にあるようです: use 、 use traditional 、またはスタックから割り当てます。ss_spmmap()malloc()

私がシステムを正しく理解しているのであれば、アプローチ #3: スタックから割り当てることは絶対にしたくありません。関数を終了すると、スタック スペースはすぐに再利用されて再利用され (つまり、変更され)、 の機能が損なわれますsigaltstack()

だから私はトラディショナルをお勧めしmalloc()ます。mmap()構文が気に入れば、一緒に行くことができます。私の理解では、NULLアドレスを渡すことはとにかくmmap()と同等malloc()です。

于 2013-02-08T18:14:32.643 に答える