utimes(2) изменить последнее время доступа и изменения к inode

Other Alias

utime

ОБЗОР

#include <sys/types.h>
#include <utime.h>


int utime(const char *filename, const struct utimbuf *times);

#include <sys/time.h>

int utimes(const char *filename, const struct timeval times[2]);

ОПИСАНИЕ

Замечание: современным приложениям лучше использовать интерфейсы, описанные в utimensat(2).

Системный вызов utime() изменяет время доступа и изменения у inode, указанного в filename на значения полей actime и modtime из структуры times, соответственно.

Если значение times равно NULL, то время доступа и изменения файла устанавливаются в текущее время.

Изменение временных меток разрешено если: процесс имеет соответствующие права или эффективный пользовательский идентификатор равен пользовательскому идентификатору файла, или значение times равно NULL и процесс имеет права на запись в файл.

Структура utimbuf выглядит так:

struct utimbuf {
    time_t actime;       /* время доступа */
    time_t modtime;      /* время изменения */
};

Системный вызов utime() позволяет указывать временные метки с точностью до 1 секунды.

Системный вызов utimes() выполняет подобное действие, но аргумент times указывает на массив, а не на структуру. Элементы массива представляют собой структуры timeval, с помощью которых можно указывать временные метки с точностью до 1 микросекунды . Структура timeval:

struct timeval {
    long tv_sec;        /* секунды */
    long tv_usec;       /* микросекунды */
};

В times[0] задаётся новое время доступа, а в times[1] новое время изменения. Если значение times равно NULL, то аналогично utime(), время доступа и изменения файла устанавливаются в текущее время.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EACCES
Запрещён поиск в одном из каталогов пути path (см. также path_resolution(7)).
EACCES
Значение times равно NULL, эффективный пользовательский идентификатор вызывающего процесса не совпадает с владельцем файла, вызывающий не имеет права на запись в файл, и у вызывающего нет привилегий (Linux: не имеет мандата CAP_DAC_OVERRIDE или CAP_FOWNER).
ENOENT
Файл filename не существует.
EPERM
Значение times не равно NULL, эффективный пользовательский идентификатор вызывающего процесса не совпадает с владельцем файла и у вызывающего нет привилегий (Linux: не имеет мандата CAP_FOWNER).
EROFS
path располагается на файловой системе, доступной только для чтения.

СООТВЕТСТВИЕ СТАНДАРТАМ

utime(): SVr4, POSIX.1-2001. В POSIX.1-2008 вызов utime() помечен как устаревший.
utimes(): 4.3BSD, POSIX.1-2001.

ЗАМЕЧАНИЯ

В Linux нельзя изменять временные метки у недосягаемых (immutable) файлов или задавать временные метки, отличные от текущего времени для файлов, в которые можно только дописывать.