gpt4 book ai didi

c - 为什么这段代码没有按预期工作?

转载 作者:太空宇宙 更新时间:2023-11-03 23:29:56 24 4
gpt4 key购买 nike

我最近开始使用信号进行编程。我在 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");

我读过这个方法here .我尝试发送 kill -s SIGINT <pid of my program>来自不同的终端窗口,但程序退出。

最佳答案

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

但为什么 sigwait() 没有如您所愿从容拦截信号?

sigwait() 被设计为 remove a signal from a mask of pending signals — 也就是说,生成的信号的传递被暂停 (SIG_BLOCKed) — 没有通常的异步信号传递。

所以,不要在您的线程中 SIG_UNBLOCK SIGINT。相反,将其保持阻塞状态,代码将按您的预期运行。如果仔细检查您提供的引用资料,您会发现该示例代码在调用 sigwait() 之前会阻止所有信号。

关于c - 为什么这段代码没有按预期工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18378513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com