gpt4 book ai didi

c - C中具有多个警报的多个线程

转载 作者:太空宇宙 更新时间:2023-11-04 03:03:50 25 4
gpt4 key购买 nike

我有一个客户端-服务器应用程序,在线程服务器上运行,它要求来自客户端的每个连接都创建一个新线程,客户端必须等待 x 秒才能被服务,目前我正在使用 sleep 调用每个线程函数的开头来实现这一点,但我想使用警报(SIGALARM)我将如何处理这个?

int main()
{
int sd,connfd,retbind;
struct sockaddr_in serveraddress,cliaddr;
socklen_t len;
pthread_t th1;
char buf[100];

sd = socket( AF_INET, SOCK_STREAM, 0 );
if( sd < 0 )
{
error_exit(SYSTEM_ERROR, "Socket");
}

memset( &serveraddress, 0, sizeof(serveraddress) );
serveraddress.sin_family = AF_INET;
serveraddress.sin_port = htons(MYPORT);
serveraddress.sin_addr.s_addr = htonl(INADDR_ANY);

retbind=bind(sd,(struct sockaddr*)&serveraddress,sizeof(serveraddress));
if(-1==retbind)
{
error_exit(SYSTEM_ERROR, "Bind failed");
}

listen(sd,5);

printf("-----------------------------------------\n");
printf("Server running on port number %d\n", MYPORT);
printf("------------------------------------------\n\n");

for(;;)
{
printf("Waiting for connection...\n");

len=sizeof(cliaddr);

connfd=accept(sd,(struct sockaddr*)&cliaddr,&len);
if (connfd < 0)
{
if (errno == EINTR)
printf("Interrupted system call ??");
else
error_exit(SYSTEM_ERROR, "Connection");
}

printf("Connection from %s\n",
inet_ntop(AF_INET,&cliaddr.sin_addr,buf,sizeof(buf)));

pthread_create(&th1,NULL,thread_func,(void*)connfd);


}

}

void* thread_func(void *connfd)
{
socket_ip buffer;
int pointer = 0, n;

pthread_detach(pthread_self());

sleep(30);

readWriteFile( (int)connfd, &buffer);

show_packet(&buffer);

close((int)connfd);

pthread_exit(NULL);
}

例如,如果在 10 秒、20 秒和 25 秒时收到客户端请求,则应在 40 秒、50 秒和 55 秒时为它们提供服务。

帮助:/

最佳答案

您可能想使用像 select 这样的多路复用调用或 pselectpoll .另见 select tutorial手册页。你可以使用 posix timers

许多库为您提供良好的事件处理,例如libevent , Glib event loop来自 Gtk 等...

关于c - C中具有多个警报的多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8165423/

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