Что вижу - о том пою (aragont) wrote,
Что вижу - о том пою
aragont

Программирование и жизнь

Начинающие программисты свято верят, что программа это чистая логика, что её можно продумать и, возможно, даже доказать. Программисты с опытом знают, что самая идеальная программа компилируется неидеальным компилятором, выполняется на не очень идеальном физическом процессоре да ещё и в окружении сотен других, невидимых для нее, но всё таки существующих, программ.

Самый крайний случай неидеального поведения алгоритма иллюстрируется такой шуточной программой (на каком-то условном языке):

A=2
ЕСЛИ А не равно 2 ТО Печать "Что-то пошло не так"

Случай редкий, но вполне возможный если параллельно с этой программой в памяти сидит другая, которая в этот же момент времени записывает в ячейку А что-то другое, например 6.

А вот случай реальный (интересен в основном программистам).

В локальной сети нашего института десяток компьютеров совместно обрабатывают данные, которые лежат на файловом сервере. Чтобы скоординировать работу, они создают файлы с именами вида: "комп1_взял_работу" и "комп1_завершил_работу". Если файл "взял_работу" был создан больше часа назад, а файла "завершил_работу" нет, то это означает, что либо программа слетела, либо компьютер просто выключили, не дожидаясь завершения счёта. В любом случае это задание подхватывает какой-то другой компьютер в сети.

Предположим, что на каком-то компьютере неверно выставили время. Например, вместо екатеринбургского часового пояса (у него нынче имя RTZ 4) поставили московский (RTZ 2). Какое время будет у файла, который этот компьютер создаст на сервере? Время как на компьютере? Или время как на сервере?

Оказывается, наука не знает ответа на этот вопрос и мы наткнулись на пример, который позволяет выбирать любой из вариантов.

В командной строке (в нашем случае в Linux) есть возможность создать файл с помощью перенаправления:

Обнулить файл и записать в него "qq"

echo qq > file.txt

Не портить файл (если существует) и дописать ему в конец "qq"

echo qq >> file.txt

Так вот, если из Linux создавать файл на сетевом диске машины с Windows, то первый способ создаёт файл с временем из Linux, а второй с временем из Windows.

Если заглянуть глубже, то в первом случае делается системный вызов open с флагами O_WRONLY, O_CREAT и O_TRUNC, а во втором случае O_WRONLY, O_CREAT и O_APPEND. Драйвер smbfs в первом случае высылает команду "удалить и создать" плюс опцию со своим текущим временем, а во втором "открыть или создать" без указания времени.
Tags: программы
Subscribe

  • ЗОЖ

    Слабоэнергетический напиток с микровитаминами и полиминералами. (то ли минералка, то ли сода с солью для полоскания горла)

  • Автопранк

    В автобусах Екатеринбурга работают две системы голосового оповещения. Первая на подъезде к остановке нежным женским голосом оповещает пассажиров:…

  • За что же Лёшку вы Навального..

    В отношении научности тех или иных теорий нынешняя молодёжь любит вспоминать принцип Поппера, который гласит: Если ваша теория не предусматривает…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments