Несколько потоков с несколькими сигналами тревоги в C - PullRequest
1 голос
/ 17 ноября 2011

У меня есть клиент-серверное приложение, работающее на многопоточном сервере, которое требует, чтобы каждое соединение от клиента создавало новый поток, клиент должен ждать 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 Ответ

2 голосов
/ 17 ноября 2011

Вы, вероятно, хотите использовать мультиплексные вызовы, такие как , выберите или pselect или опрос . См. Также справочную страницу select man. И вы можете использовать posix таймеры

И многие библиотеки предоставляют вам хорошую обработку событий, например, например. libevent , Цикл событий Glib из Gtk и т. Д. И т. Д. *

...