Действительно ли fwrite является атомарным?

Простой вопрос:

Я должен добавить некоторый вход к своей программе.

Если два процесса используют "fwrite" на том же файле, но не тот же дескриптор файла будет записанные сообщения журнала быть атомарными или смешанными. Существует ли предел длины?

Это - определенное поведение ANSI-C или определенная реализация? Если позже, что находится на MacOSX, Linux и Windows MSVC?

12
задан Lothar 7 February 2010 в 23:17
поделиться

2 ответа

empty () возвращает значение true для всех значений FALSE , фактически это «not» (! ) в маскировке. Я думаю, вы имели в виду isset ()

-121--2034556-

Из руководства: Возвращает значение FALSE, если var имеет непустое и ненулевое значение.

Пустыми считаются следующие вещи:

  • «» (пустой ряд)
  • 0 (0 как целое число)
  • «0» (0 как последовательность) NULL
  • FALSE array () (пустой массив) var
  • $ var; (переменная объявлена, но без значения в классе)

More: http://php.net/manual/en/function.empty.php

-121--2034552-

Его можно смешивать.

Если в один файл записано несколько потоков/процессов, необходимо использовать блокировку.

Альтернативой является передача сообщений регистрации в выделенную службу/поток. Отличным инструментом для внедрения является syslog , который, несомненно, установлен на всех униксах и может быть запущен в Windows .

2
ответ дан 26 October 2019 в 10:45
поделиться

Проведя небольшое исследование, я обнаружил следующее в этой ссылке :

Стандарт POSIX требует, чтобы операции C stdio FILE * были атомарными. POSIX -соответствующие библиотеки C (например, в Solaris и GNU / Linux) имеют внутренний мьютекс для сериализации операций с FILE * s.

Похоже, что вызовы должны быть атомарными, но это зависит от вашей платформы. В той же ссылке есть еще один абзац, который позволяет вам думать, что программист должен позаботиться:

Итак, для версии 3.0 вопрос "является ли безопасна ли многопоточность для ввода-вывода" должен быть {{1 }} ответил: "Является ли библиотека C вашей платформы потокобезопасной для ввода-вывода?" Некоторые из них по умолчанию, некоторые нет; многие предлагают несколько реализаций библиотеки C с различными компромиссами безопасности потоков и эффективности. Вы, программист, всегда обязаны заботиться о нескольких потоках.

Кроме того, поскольку у вас есть два разных ФАЙЛА * в двух разных процессах, я думаю, у вас нет выбора.

16
ответ дан 26 October 2019 в 10:45
поделиться
Другие вопросы по тегам:

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