gpt4 book ai didi

c - 每 20 秒打印一次消息的信号(C 多线程程序)

转载 作者:行者123 更新时间:2023-11-30 15:14:16 24 4
gpt4 key购买 nike

我试图在多线程程序中每 20 秒打印一条消息。我有一个有两个线程的服务器。一个线程等待传入连接,并在连接时为客户端创建一个新线程。

我看过这个:C: SIGALRM - alarm to display message every second但对于我的代码,我不确定将循环放在哪里。我不允许创建新线程或使用 sleep()sleep() 的任何变体。

服务器接受器线程的代码:

while((csock = accept(sock, (struct sockaddr *) &theClient, (socklen_t *) &cl)))
{
pthread_t newClient;
new_sock = malloc(sizeof(socket_t));
*new_sock = csock;
pthread_create(&newClient, NULL, getInput, (void *) new_sock)
}

另一个线程只是处理客户端的输入。我尝试将循环放入上面的循环中,但它从不接受新连接。

我该如何去做呢?任何帮助将不胜感激。

最佳答案

您的问题目前似乎是accept()正在阻塞线程,直到有新连接进入;因此您无法打印任何内容。

您可以在循环中使用非阻塞accept()来检查连接,并在同一循环中等待20秒。请注意,这是非常低效的,因为这个循环不会停止;它 100% 使用 1 个 cpu 核心。

// sock is listening
fcntl(sock,F_SETFD,O_NONBLOCK);

time_t tm = time(); // Unix timestamp, in seconds.

while(true) {
csock = accept(sock, (sockaddr*)&theClient, (socklen_t*)&cl);
if (csock==-1) {
if (errno==EAGAIN || errno==EWOULDBLOCK); // No connection at the
// moment, we need to try
// again later.
else break; // Some other error occurred
}
else { // If it is connected
pthread_t newClient;
new_sock = malloc(sizeof(socket_t));
*new_sock = csock;
pthread_create(&newClient,NULL,getInput,(void*)new_sock);
}

if (time()-tm>=20) { // At least 20 seconds have elapsed since
// last message.
printf("Hello World!!\n");
tm = time(); // Start waiting for another 20 seconds.
}
}

使用 select() 等待新连接会更加高效 - 您还可以设置一个超时,以便您可以打印消息

编辑:您不想使用信号,因为正如您链接的文章中所述,您无法从信号内部使用 printf处理程序。如果您使用信号处理程序设置标志,则除非使用非阻塞accept(),否则您将无法读取该标志(因为否则accept()可能会阻塞一分钟,但不会打印任何内容)。

关于c - 每 20 秒打印一次消息的信号(C 多线程程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34113842/

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