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

Signal to print message every 20 seconds (C Multithreaded program)

我正在尝试在多线程程序中每 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 秒。请注意,这是非常低效的,因为此循环不会停止;它使用 1 cpu 个内核的 100%。

// 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() 可能会阻塞一分钟但不会打印任何内容)。