C - SIGALRM не получен

Я новичок в сигналах, я пытаюсь настроить SIGALRM на службу UDP echo, как практику программирования сокетов.
Так что здесь у меня есть сокет UDP, клиент отправляет строку на сервер и ждет ответа (любой ответ, здесь строка повторяется сервером).
Цель состоит в том, чтобы установить SIGALRM и позволить клиенту переслать строку несколько раз, если сервер не получил никаких ответов, или пакеты UDP потерялись.

Здесь я использовал небольшой пример и упростил длинные строки с..., вы можете получить более подробную информацию о моем репозитории github (строка 51)

SIGALRM-Client.c

unsigned int tries = 0;

void CatchAlarm()
{
    tries += 1;
}

int main(int argc, char **argv)
{
    // SKIPPED
    // ...
    struct sigaction handler;
    handler.sa_handler = CatchAlarm;
    handler.sa_flags = 0;
    if(sigfillset(&handler.sa_mask) < 0)
        return 1;

    if(sigaction(SIGALRM, &handler, 0) < 0)
        return 2;

    ssize_t bytes;

    bytes = sendto(servSock,...);

    while((bytes = recvfrom(servSock,...)) < 0) {
        // alarm went off
        if(errno == EINTR) {
            // try 5 times
            if(tries < 5) {
                bytes = sendto(servSock,...);
            } else {
                fprintf(stdout, "no response, waiting...\n");
            }
        } else {
            fprintf(stdout, "failed to get data\n");
            return 3;
        }
    }
    // recvfrom() got something, cancel timeout
    alarm(0);
    fprintf(stdout, "received %d bytes of data\n", bytes);
    close(servSock);
}

Когда я запускаю клиент, он не будет получать сигнал SIGALRM и пакеты UDP теряются с первой попытки?!
Клиент не будет повторять отправку строки, а затем завершать работу после 5 попыток, вместо этого он ждет ответа сервера навсегда!
Что мешает клиенту получить SIGALRM?
Я что-то здесь упустил?

1 ответ

Решение

Ваш код в репозитории GitHub никогда не звонит alarm() с ненулевым номером. Вы никогда не получите сигнал тревоги, доставленный автоматически, если вы фактически не запросите его. Полагаясь на какой-либо другой процесс для отправки вашего процесса, сигнал тревоги не является устойчивым.

Другие вопросы по тегам