C中有多个警报的多个线程

时间:2011-11-17 10:14:01

标签: c multithreading pthreads signals

我有一个在线程服务器上运行的客户端 - 服务器应用程序,它要求客户端的每个连接都创建一个新线程,客户端必须在服务之前等待x秒,目前我正在使用睡眠调用每个线程函数的开头都会发生这种情况,但是我想使用警报(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秒时提供服务请求。

帮助:/

1 个答案:

答案 0 :(得分:2)

您可能希望使用selectpselectpoll等多路复用调用。另请参见select tutorial手册页。你可以使用posix timers

许多图书馆为您提供良好的事件处理,例如来自Gtk等的libeventGlib event loop等等......