我正在使用pthread在C中开发客户端/服务器。在收到SIGINT或SIGTERM后关闭服务器之前线程的等待终止工作(C中Posix线程)
这是一款纸牌游戏,其中server
是两个clients
之间的玩家。
我这种情况
server.c:使用用于监听最终进入上accept
连接线程调度
int main (int argc, char * argv[])
:
主
pthread_create(&sig_thread, NULL, &thread_signal_handler, &server_Socket);
线程捕捉内部主函数创建信号(方便maskered)
pthread_create(&tid[i++], NULL, &worker, (void*) arr_args)
每个客户端相关联,以创建线程(TID是阵列线程 ID)
pthread_join(sig_thread, NULL)
加入线程信号
pthread_join(tid[i], NULL)
加入用于连接每个客户端创建的线程。
工人:
void * worker(void * args)
做他的工作,并终止
线程信号处理程序:
void * thread_signal_handler(void * arg)
无效* thread_signal_handler(无效* ARG){
sigset_t set; int sig, n; int * socket = (int*) arg; sigemptyset(&set); sigaddset(&set, SIGINT); sigaddset(&set,SIGTERM); while (server_UP) { /* wait for a signal */ if (sigwait(&set, &sig)) perror("Sigwait"); /* received SIGINT or SIGTERM - closing server */ if ((sig == SIGINT || sig == SIGTERM)) { printf(TERM_SERVER"\n"); server_UP = 0; /* global variable */ /* close socket blocked on MAIN */ shutdown(*socket, SHUT_RDWR); } return (void *) EXIT_SUCCESS;
}
以这种方式,信号被钓到阱和所述服务器是立即终止。 我需要,如果有匹配进行中,等待所有的工作人员完成他们的工作正常,所以我想知道如何说线程处理程序“你收到一个SIGINT(或SIGTERM)?好吧,等待终止所有工作人员“。
有什么建议吗?如果你需要更多的代码,我会编辑这篇文章。
在所有线程上调用'pthread_join()'? – alk