Если вам нужны высокоточные / быстрые вычисления / вычисления с плавающей запятой, вам может потребоваться использовать FFI и long double, поскольку собственный тип Haskell еще не реализован (см. https://ghc.haskell.org/ ПРОФ / GHC / билет / 3353 ).
Из документации touch
(coreutils):
При изменении и доступа, и время модификации к текущему время, "прикосновение" может изменить отметки времени для файлов, которые пользователь работает не принадлежит, но имеет запись разрешение на. В противном случае пользователь должны владеть файлами.
Полномочия на выполнение каталога, который содержит файл, определяют возможность удаления или изменения информации inode для записи в каталоге, связанном с файлом.
Как видно из комментария ниже, я замалчил техническую причину, но вместо этого предложил причину, по которой поведение может быть не таким, как ожидалось. Так как вы можете выполнить в каталоге, есть несколько вещей, которые вы можете сделать, чтобы повозиться с файлом, и я собираюсь оставить все как есть.
Если вы хотите запретить кому-либо, кроме root, изменять файл, лучший способ - это чтобы использовать имя файла chattr + i в файле. Даже root не сможет выполнять с ним какие-либо действия, не запустив на нем chattr -i. Это относится к Linux, поэтому YMMV.
Вот соответствующий вывод: strace "touch test.txt"
open("test.txt", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK|O_LARGEFILE, 0666) = -1 EACCES (Permission denied)
futimesat(AT_FDCWD, "test.txt", NULL) = 0
Он действительно получает ошибку "Permission denied error" в системном вызове open (2) относительно EACCES. См. Соответствующий раздел на странице руководства utimes (2) .
Тем не менее, ему удается обновить метку времени с помощью системного вызова futimesat (2) .
Как и другие, указано, похоже, что права доступа к каталогу имеют права на обновление меток времени доступа / moficiation.
Однако вы можете изменить атрибут файла на неизменяемый, используя:
chattr +i test.txt
Примечание: это может сделать только root, и это очень суровый способ отключить доступ к файлам. Но в крайнем случае может пригодиться. Кроме того, это функция ext2 / 3/4, которая, насколько мне известно, недоступна в других файловых системах.
Вы можете обновить время модификации, если вы являетесь владельцем файла, независимо от разрешения на запись. (Это не связано с какими-либо разрешениями для каталога.)
Из POSIX.1-2008:
Только процесс с эффективным идентификатором пользователя, равным идентификатору пользователя файла, или с правом записи в файл , или с соответствующими привилегиями может использовать
futimens ()
илиutimensat ()
с нулевым указателем в качестве аргумента раз или с обоими полямиtv_nsec
, установленными на специальное значениеUTIME_NOW
. Только процесс с эффективным идентификатором пользователя, равным идентификатору пользователя файла или с соответствующими привилегиями, может использоватьfutimens ()
илиutimensat ()
с ненулевым аргументом раз, который делает не имеют для обоих полейtv_nsec
значенияUTIME_NOW
и не имеют для обоих полейtv_nsec
значенияUTIME_OMIT
. Если в обоих поляхtv_nsec
задано значениеUTIME_OMIT
, проверка прав собственности или прав для файла выполняться не будет, но другие условия ошибки все равно могут быть обнаружены (включая ошибки [EACCES], связанные с префикс пути).