Определение значений errno для библиотечных функций

Я пишу небольшую библиотеку для связи с устройством rs232.

Большинство функций записывают несколько байтов в дескрипторе, ждут ответа, анализируют его и возвращают:

int demo_function(int fd)
{
    if (sendcommand(command)==0)
    {
        if (getreply(buffer)==0)
        {
            if (buffer == ACK)
                return 0;           //Success, returns 0
            else if (buffer == NACK)
                return -1;          //Error, Nack received
            else
                return -1;          //Error, unexpected answer
        }
        else
            return -1;              //Error, Timeout
    }
    else
        return -1;                  //Error, send failled.
}

Я хотел как можно больше следовать стандарту, поэтому я возвращаю 0 в случае успеха, -1 в случае ошибки. Мне нужно определить значения, которые я должен установить в errno.

-Нак получен: я не смог найти ни одной ошибки, которая бы подходила этому делу.

-Неожиданный ответ: EBADMSG.

-Время: ETIME или ETIMEDOUT.

-Отправить не удалось: EIO?

Какую ошибку я должен использовать для случая NACK, и подходят ли номера ошибок в других случаях? Или я должен остаться в стороне от ошибок и найти другой способ сообщения об ошибках (например, различные возвращаемые значения)?

2 ответа

Решение

Посмотрите на стандарт для списка errnos. Лично я бы держался подальше от errnoи использовать отдельные параметры и т. д.

In your case the function doesn't return anything useful so you could use the return value as an indication of success (0) or the type of error (!0).

Вероятно, следует различать возвращаемое значение между ожидаемыми ответами устройства (например, ACK и NACK) и общими непредвиденными сбоями системы (такими как таймауты, неудачные отправки и т. Д.). Я бы рекомендовал возвращать 0 при успехе, 1 при NACK и -1+errno при сбоях системы.

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