В странице справочника для записи системного вызова (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
указывает, что вызов для записи был прерван процессом, получающим сигнал.
Почему?
Стивенс, вероятно, делает это для того, чтобы поймать старую реализацию write(), которая вела себя по-другому. Например, Single Unix Spec (http://www.opengroup.org/onlinepubs/000095399/functions/write.html)
Где этот том IEEE Std 1003.1-2001 требует возврата -1 и установки errno на [EAGAIN], наиболее исторические реализации возвращают ноль
Также, и просто чтобы быть немного педантичным здесь, если вы не пишете в сокет, я бы проверил, что длина буфера ("счет" в первом примере) на самом деле вычисляется корректно. В примере со Стивенсом вы бы даже не выполнили вызов write(), если бы длина буфера была 0.
Это гарантирует, что код не вращается на неопределенный срок, даже если файловый дескриптор не является разъемом TCP или неожиданные неблокирующие флаги. В некоторых системах определенные устаревшие безблокированные режимы (например, O_NDELAY
) Причина Написать ()
, чтобы вернуть 0 (без настройки errno
) Если данные не могут быть написаны без блокировки, по крайней мере, для определенных типов дескрипторов файлов. (Стандарт POSIX O_NONBLOCK
использует возврат ошибки для этого случая.) И некоторые из мод блокировки в некоторых системах применяются к базовому объекту (например, сокет, FIFO), а не дескриптор файла, а также так Может даже быть включен другим процессом, имеющим открытый файловый дескриптор для того же объекта. Код защищает себя от вращения в такой ситуации, просто обрабатывая его как ошибку, поскольку она не предназначена для использования с модами безблокировки.
Можно использовать все методы 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 с кодом ошибки.