2

我最近开始使用信号进行编程。我在 C 中的多线程服务器代码中使用了它们。这是与信号相关的代码部分,但它不能正常工作:

信号处理程序:

void* Ctrl_C_handler(void *arg)
{
int *sock_fd_ptr = (int*)arg;
sigset_t set;
int err, sig;

err = sigemptyset(&set);                // Clear the signals holder set
if(err) perror("sigemptyset(&set)");

err = sigaddset(&set, SIGINT);          // Add the SIGINT: Ctrl+C
if(err) perror("siaddset(&set, SIGINT)");

err = pthread_sigmask(SIG_UNBLOCK, &set, NULL); // Set mask as to unblock SIGINT
if(err) perror("pthread_sigmask(SIG_SETMASK, &set, NULL)");

printf("Signal handler active:\n");
while(1)        // Ctrl+C
{
    err = sigwait(&set, &sig);          // Wait for signal to occur
    if(err)
    {
        perror("sigwait(&set, &sig)");
        printf("Error handling the signal, SigHandlerThread exiting..\n");
        break;
    }

    if(sig == SIGINT)
    {
        printf("Ctrl+C detected by server !!\n");
        printf("No more connections will be accepted!!");
        if(*sock_fd_ptr > 0)
        {
            close(*sock_fd_ptr);
            *sock_fd_ptr = -1;
            break;
        }
    }   
}
return NULL;

}

Main() 内部:

/*********** Signal Handling *************/

sigset_t set;                       // declare a set to hold the signals 
err = sigfillset(&set);             // Fill the set with all the signals
if(err) perror("sigfillset(&set)");

err = sigthreadmask(SIG_BLOCK, &set, NULL);  // Block/Mask the signals in the set
if(err) perror("sigthreadmask(SIG_BLOCK, &set, NULL)");

err = pthread_create(&sig_handler_tid, NULL, Ctrl_C_handler, (void *)&sock_fd);
                                    // Create a thread for handling signals
if(err) perror("pthread_create");

我在这里阅读了这个方法。我尝试kill -s SIGINT <pid of my program>从不同的终端窗口发送,但程序退出。

4

1 回答 1

2

当 SIGINT 被发送到您的进程时,它会被传递到唯一解除阻塞的线程,即您的Ctrl_C_handler线程。信号传递意味着采取与信号相关的任何操作,正如您所知,SIGINT 的默认操作是进程终止。

但是为什么 sigwait() 不按照您的意图平静地拦截信号呢?

sigwait() 旨在从待处理信号的掩码中删除一个信号——即,生成的信号被暂停传递(SIG_BLOCKed)——没有信号传递的通常异步戏剧。

所以,不要在你的线程中使用 SIG_UNBLOCK SIGINT 。相反,保持它被阻止,代码将按你的意愿工作。如果您仔细检查您提供的参考资料,您会发现该示例代码在调用 sigwait() 之前阻塞了所有信号。

于 2013-08-22T12:57:41.550 回答