Как выполнить заявление после сигвейта - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь узнать о сигналах. Я написал небольшой кусок кода, используя sigwait и pthread_kill. Оператор после sigwait не выполняется, даже если я выдал сигнал, используя pthread_kill. Я получаю вывод как «До сигнала в реальном времени 0» Ожидаемый вывод: «До»

#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>

void *fun(void *arg)
{
    sigset_t set;
    int signal;
    sigemptyset(&set);
    sigaddset(&set,SIGRTMIN);

    printf("Before\n");
    sigwait(&set,&signal);
    printf("After\n");
}
int main()
{
    pthread_t obj;
    int ret = pthread_create(&obj,NULL,fun,NULL);
    sleep(10);
    pthread_kill(obj,SIGRTMIN);
    return 0;
}

1 Ответ

1 голос
/ 26 октября 2019

У вас есть две проблемы в вашем коде:

1) Сигнал SIGRTMIN немедленно уничтожит поток, прежде чем sigwait() сможет удалить его из очереди. Если вы хотите, чтобы sigwait на самом деле возвращало , вы должны установить для него обработчик сигнала:

void sigh(int s){}
void *fun(void *arg)
{
    struct sigaction sa;
    sa.sa_handler = sigh;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    sigaction(SIGRTMIN, &sa, 0);
    ...

2) Возможно, вы возвращаетесь с main() до того, как дочерний поток получилвыход, который снова может убить его, прежде чем можно будет напечатать «После». Позвоните pthread_join(obj, 0) или хотя бы добавьте sleep(1) после pthread_kill.

...