Сигнал ожидающего списка нового созданного потока не пуст? - PullRequest
1 голос
/ 27 декабря 2011

В справочной странице pthread_create сказано: " Набор ожидающих сигналов для нового потока пуст ". Но я написал некоторый код для теста, который получил противоположный результат, что список ожидающих сигнала нового созданного потока не пуст. Код ниже:

void* thread_fun(void* arg)
{
    int s;
    sigset_t pendingset;

    s = sigemptyset(&pendingset);
    if(s != 0)
    {
        printf("sigempty error.\n");
    }
    else{
        s = sigpending(&pendingset);
        if(s == 0){
            if(sigismember(&pendingset, SIGINT))
                printf("SIGINT in pending signal list.\n"); // this msg is printed
        }
    }

    return NULL;
}

int main()
{
    pthread_t tid;
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    pthread_sigmask(SIG_BLOCK, &set, NULL);

    sleep(10); // send SIGINT to the process using kill -SIGINT pid
    printf("before create thread...\n");
    pthread_create(&tid, NULL, thread_fun, NULL);

    pthread_join(tid, NULL);

    return 0;
}

Во время периода ожидания я отправил SIGINT в процесс. Поскольку сигма-маска установлена, включая SIGINT, в этот момент принятый сигнал SIGINT находился в состоянии ожидания в списке сигналов. После pthread_create, в новом потоке sigpending возвращает ожидающие сигналы вызывающего потока, и SIGINT включается в набор. Так что это несовместимо с man-страницей.

Любая помощь приветствуется.

1 Ответ

1 голос
/ 28 декабря 2011

Мне кажется, проблема в том, что отправленный вами сигнал является сигналом уровня процесса, поэтому он ожидает весь процесс (и всех потоков, у которых он заблокирован), независимо от того, ожидал ли он его до создания потока или нет. документы для sigpending() говорят (выделение добавлено):

Функция sigpending() должна хранить в местоположении, указанном аргументом set, набор сигналов, которыезаблокирован от доставки в вызывающий поток и ожидающих в процессе или вызывающем потоке.

Если сигнал, ожидающий при вызове pthread_create(), был сигналом уровня потока, то это не будет в ожидании на вновь созданном потоке.Вы можете проверить это, отправив сигнал с помощью функции pthread_kill(pthread_self(), SIGINT).

Я согласен, что формулировка об очищении ожидающих сигналов для новых потоков не очень ясна по этому поводу.

...