Имеет возвращаемое значение 0 от записи (2) в C ошибка?

В странице справочника для записи системного вызова (2) -

ssize_t write(int fd, const void *buf, size_t count);

это говорит следующее:

Возвращаемое значение

На успехе число записанных байтов возвращается (нуль указывает, что ничто не было записано). На ошибке,-1 возвращается, и errno установлен соответственно. Если количество является нулем, и дескриптор файла относится к регулярному файлу, 0 может быть возвращен, или ошибка могла быть обнаружена. Для специального файла результаты не являются портативными.

Я интерпретировал бы это, чтобы означать, что возврат 0 просто средства, что ничто не было записано по любой произвольной причине.

Однако Stevens в UNP рассматривает возвращаемое значение 0 как фатальная ошибка при контакте с дескриптором файла, который является сокетом TCP (это обертывается другой функцией, которая звонит exit(1) на коротком количестве):

ssize_t /* Write "n" bytes to a descriptor. */
writen(int fd, const void *vptr, size_t n)
{
    size_t      nleft;
    ssize_t     nwritten;
    const char  *ptr;

    ptr = vptr;
    nleft = n;
    while (nleft > 0) {
        if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
            if (nwritten < 0 && errno == EINTR)
                nwritten = 0;       /* and call write() again */
            else
                return(-1);         /* error */
        }

        nleft -= nwritten;
        ptr   += nwritten;
    }
    return(n);
}

Он только рассматривает 0 как законное возвращаемое значение если errno указывает, что вызов для записи был прерван процессом, получающим сигнал.

Почему?

13
задан Robert S. Barnes 1 February 2010 в 12:01
поделиться

4 ответа

Стивенс, вероятно, делает это для того, чтобы поймать старую реализацию write(), которая вела себя по-другому. Например, Single Unix Spec (http://www.opengroup.org/onlinepubs/000095399/functions/write.html)

Где этот том IEEE Std 1003.1-2001 требует возврата -1 и установки errno на [EAGAIN], наиболее исторические реализации возвращают ноль

7
ответ дан 2 December 2019 в 01:10
поделиться

Также, и просто чтобы быть немного педантичным здесь, если вы не пишете в сокет, я бы проверил, что длина буфера ("счет" в первом примере) на самом деле вычисляется корректно. В примере со Стивенсом вы бы даже не выполнили вызов write(), если бы длина буфера была 0.

1
ответ дан 2 December 2019 в 01:10
поделиться

Это гарантирует, что код не вращается на неопределенный срок, даже если файловый дескриптор не является разъемом TCP или неожиданные неблокирующие флаги. В некоторых системах определенные устаревшие безблокированные режимы (например, O_NDELAY ) Причина Написать () , чтобы вернуть 0 (без настройки errno ) Если данные не могут быть написаны без блокировки, по крайней мере, для определенных типов дескрипторов файлов. (Стандарт POSIX O_NONBLOCK использует возврат ошибки для этого случая.) И некоторые из мод блокировки в некоторых системах применяются к базовому объекту (например, сокет, FIFO), а не дескриптор файла, а также так Может даже быть включен другим процессом, имеющим открытый файловый дескриптор для того же объекта. Код защищает себя от вращения в такой ситуации, просто обрабатывая его как ошибку, поскольку она не предназначена для использования с модами безблокировки.

3
ответ дан 2 December 2019 в 01:10
поделиться

Можно использовать все методы DOM-манипуляции - appendChild, insertBefore, repleyChild, insertedHTML и т. д. - и контролировать iniveHTML с помощью onpropertychange.

Возможно, вы сможете найти решение, удовлетворяющее вашим требованиям.

BTW, похоже, что DOMNodeInserted и т.д. будут устаревать браузерами в будущем. См. http://www.w3.org/TR/DOM-Level-3-Events/#events-mutationevents

-121--2281866-

, если вы хотите создать, скажем, zipcode, и не возражайте против начала нулей, если это 5 цифры, которые вы можете использовать:

(""+Math.random()).substring(2,7)
-121--983235-

Как говорится на вашей странице, возвращаемое значение 0 «не переносится» для специальных файлов. Сокеты - это специальные файлы, поэтому результат может означать что-то другое для них.

Обычно для сокетов значение 0 байт от read () или write () указывает на то, что сокет закрылся, и после получения 0 последующие вызовы возвращают -1 с кодом ошибки.

0
ответ дан 2 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: