在pthread_cond_wait之前传递信号时,进程自动退出 #包括“apue.h” #包括 int quitflag; sigset_t掩模; pthread\u mutex\u t lock=pthread\u mutex\u初始值设定项; pthread_cond_t wait=pthread_cond_初始值设定项; 空虚* thr_fn(无效*参数) { 我错了,先生; 对于(;;){ err=sigwait(&mask,&signo); 如果(错误!=0) err_exit(err,“sigwait失败”); 开关(信号){ 案例信号: printf(“\ninterrupt\n”); 打破 案例SIGQUIT: pthread_mutex_lock(&lock); quitflag=1; pthread_mutex_unlock(&lock); pthread_cond_信号(&wait); 返回0; 违约: printf(“意外信号%d\n”,签名); 出口(1); } } } int 主(空) { INTERR; sigset\u t oldsmask; pthread_t tid; sigpemptyset(&mask); sigaddset(&mask,SIGINT); sigaddset(&mask,SIGQUIT); if((err=pthread\u sigmask(SIG\u块、掩码和旧掩码))!=0) err_退出(err,“信号块错误”); err=pthread\u create(&tid,NULL,thr\u fn,0); 如果(错误!=0) err_exit(err,“无法创建线程”); **睡眠(20);***在此处添加了代码*/ pthread_mutex_lock(&lock); while(quitflag==0) pthread_cond_wait(&wait,&lock);/*首先解锁,然后挂起*/ pthread_mutex_unlock(&lock); quitflag=0; if(sigprocmask(SIG_SETMASK,&oldmask,NULL)

在pthread_cond_wait之前传递信号时,进程自动退出 #包括“apue.h” #包括 int quitflag; sigset_t掩模; pthread\u mutex\u t lock=pthread\u mutex\u初始值设定项; pthread_cond_t wait=pthread_cond_初始值设定项; 空虚* thr_fn(无效*参数) { 我错了,先生; 对于(;;){ err=sigwait(&mask,&signo); 如果(错误!=0) err_exit(err,“sigwait失败”); 开关(信号){ 案例信号: printf(“\ninterrupt\n”); 打破 案例SIGQUIT: pthread_mutex_lock(&lock); quitflag=1; pthread_mutex_unlock(&lock); pthread_cond_信号(&wait); 返回0; 违约: printf(“意外信号%d\n”,签名); 出口(1); } } } int 主(空) { INTERR; sigset\u t oldsmask; pthread_t tid; sigpemptyset(&mask); sigaddset(&mask,SIGINT); sigaddset(&mask,SIGQUIT); if((err=pthread\u sigmask(SIG\u块、掩码和旧掩码))!=0) err_退出(err,“信号块错误”); err=pthread\u create(&tid,NULL,thr\u fn,0); 如果(错误!=0) err_exit(err,“无法创建线程”); **睡眠(20);***在此处添加了代码*/ pthread_mutex_lock(&lock); while(quitflag==0) pthread_cond_wait(&wait,&lock);/*首先解锁,然后挂起*/ pthread_mutex_unlock(&lock); quitflag=0; if(sigprocmask(SIG_SETMASK,&oldmask,NULL),c,linux,systems-programming,C,Linux,Systems Programming,这是apue检查“sigwait”的代码,我在调用pthread\u cond\u wait之前插入“sleep(20)”,用./a.out启动程序,然后用thread thr\u fn start启动,在“20秒”之前,我在ctrl+\时发送“signal quit”,然后线程退出,几分钟后,主进程自动退出, 我不知道为什么?有人能解释一下吗?我的平台是centos,谢谢你发送SIGQUIT,线程解锁互斥和信号(pthread\u cond\u signal),因此主线程中的循环中断并退出。在

这是apue检查“sigwait”的代码,我在调用pthread\u cond\u wait之前插入“sleep(20)”,用./a.out启动程序,然后用thread thr\u fn start启动,在“20秒”之前,我在ctrl+\时发送“signal quit”,然后线程退出,几分钟后,主进程自动退出,
我不知道为什么?有人能解释一下吗?我的平台是centos,谢谢你发送SIGQUIT,线程解锁互斥和信号(
pthread\u cond\u signal
),因此主线程中的循环中断并退出。在我看来,一切都是意料之中的。你期待什么?为什么?你到底在想什么?你想知道为什么睡眠(20)没有等整整20秒吗?您是否想知道为什么要按ctrl+\几次而不是只按一次?您是否想知道为什么main在几次之后退出,而不是立即退出?你还想知道一些你可以特别告诉我们的事情吗?@usr谢谢,但这段代码可能是由于信号丢失造成的,对吗?@nos我已经通过@usr了解了,所以谢谢,只是为了检查“信号丢失”,我的第一个目的~Ok。那么睡眠对你的问题一点都不重要?(因为如果您确实有睡眠(20),那么1.ctrl+\可能会中断睡眠()并使其返回)。您发送SIGQUIT,线程就会解锁互斥锁和信号(
pthread\u cond\u signal
),因此主线程中的循环中断并退出。在我看来,一切都是意料之中的。你期待什么?为什么?你到底在想什么?你想知道为什么睡眠(20)没有等整整20秒吗?您是否想知道为什么要按ctrl+\几次而不是只按一次?您是否想知道为什么main在几次之后退出,而不是立即退出?你还想知道一些你可以特别告诉我们的事情吗?@usr谢谢,但这段代码可能是由于信号丢失造成的,对吗?@nos我已经通过@usr了解了,所以谢谢,只是为了检查“信号丢失”,我的第一个目的~Ok。那么睡眠对你的问题一点都不重要?(因为如果您确实有睡眠(20),那么1.ctrl+\可能会中断sleep()并使其返回)。
#include "apue.h"
#include <pthread.h>

int     quitflag;
sigset_t    mask;
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t wait  = PTHREAD_COND_INITIALIZER;

void *
thr_fn(void *arg)
{
    int err, signo;

    for ( ; ; ) {
    err = sigwait(&mask, &signo);
    if (err != 0)
        err_exit(err, "sigwait failed");
    switch (signo) {
        case SIGINT:
        printf("\ninterrupt\n");
        break;

        case SIGQUIT:
        pthread_mutex_lock(&lock);
        quitflag = 1;
        pthread_mutex_unlock(&lock);
        pthread_cond_signal(&wait);
        return 0;

        default:
        printf("unexpected signal %d\n", signo);
        exit(1);
    }
    }
}

int
main(void)
{
    int     err;
    sigset_t    oldmask;
    pthread_t   tid;

    sigemptyset(&mask);
    sigaddset(&mask, SIGINT);
    sigaddset(&mask, SIGQUIT);
    if ((err =  pthread_sigmask(SIG_BLOCK, &mask, &oldmask)) != 0)
        err_exit(err, "SIG_BLOCK error");

    err = pthread_create(&tid, NULL, thr_fn, 0);
    if (err != 0)
        err_exit(err, "can not create thread");

    **sleep(20);**  /* added code here */
    pthread_mutex_lock(&lock);
    while (quitflag == 0)
        pthread_cond_wait(&wait, &lock); /* first unlock, then suspend */
    pthread_mutex_unlock(&lock);

    quitflag = 0;

    if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
        err_sys("SIG_SETMASK error");

    exit(0);
}