Intereting Posts
Solaris: скрипт для поиска пути физического устройства для всех установленных волоконных карт GPT имеет неправильные записи Замена белых пробелов / символов на обратную косую черту Установка ClamAV Ubuntu Копирование полного пути файла в текстовый файл Как я могу открыть JAVA_HOME для приложений, работающих под X и / или Gnome? Неинтерактивный скрипт, выполняющийся поверх ssh, прерывается, поскольку apt-get заканчивается rsync через ssh из linux в windows sbs 2003 несоответствие протокола Почему я могу (или не могу) снова смонтировать подключенное устройство? Что происходит? Неизвестное устройство LVM: как восстановить? mutt после запроса пароля, используемого как для imap, так и для smtp Как захватить командный процесс Как «изолировать» сетевые возможности учетной записи пользователя в Linux? что означает vmstat «r»? (Как) я могу создать tmpfs как обычный (не root) пользователь?

Как touch -t работает внутри?

Как команда touch -t работает точно, внутренне (я пытался найти исходный код, но не мог)?

touch вызывает системный вызов utimes чтобы установить время модификации файла и время его доступа. В некоторых системах вместо utimes он открывает файл, а затем устанавливает время файла через дескриптор, например, с utimensat под Linux.

Вы можете увидеть, как touch работают в вашей системе, если посмотреть на вызовы системы. Под Linux используйте strace , например strace touch -d '1 hour ago' foo .

Где найти исходный код зависит от вашей операционной системы. Версия GNU находится в coreutils , есть версия в основном исходном дереве любого BSD, есть версия в BusyBox , Minix и т. Д.

Иногда вам даже не нужен исходный код. Используйте strace .

 $ strace touch -t 201212121212 foobar execve("/usr/bin/touch", ["touch", "-t", "201212121212", "foobar"], [/* 61 vars */]) = 0 [...] lots of noise [...] open("foobar", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3 dup2(3, 0) = 0 close(3) = 0 utimensat(0, NULL, {{1355310720, 0}, {1355310720, 0}}, 0) = 0 close(0) = 0 close(1) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++ 

Зачем привет, utimensat() . Что ты такое?

 $ man utimensat NAME utimensat, futimens - change file timestamps with nanosecond precision 

Таким образом, есть функция, которая изменяет временные метки файла, а touch использует ее для обновления метки времени файла. И вот как это работает внутри страны.

Вот как это работает на Solaris. truss используется вместо strace которая здесь совсем другая.

Как и в Gnu / Linux, utimensat – это системный вызов.

 $ truss -vall -u a.out -f touch -t 1306080000 z 4160: execve("/usr/bin/touch", 0xF0770FC0, 0xF0770FD4) argc = 4 ... 4160/1@1: -> main(0x4, 0xf0770fc0, 0xf0770fd4, 0xf0770f7c) ... 4160/1@1: -> atoi_for2(0xf0771131, 0x0, 0x24, 0xebc95be0) 4160/1@1: <- atoi_for2() = 13 4160/1@1: -> atoi_for2(0xf0771133, 0x0, 0x24, 0xebc95be0) 4160/1@1: <- atoi_for2() = 6 4160/1@1: -> atoi_for2(0xf0771135, 0x0, 0x24, 0xebc95be0) 4160/1@1: <- atoi_for2() = 8 4160/1@1: -> atoi_for2(0xf0771137, 0x0, 0x24, 0xebc95be0) 4160/1@1: <- atoi_for2() = 0 4160/1@1: -> atoi_for2(0xf0771139, 0x0, 0x24, 0xebc95be0) 4160/1@1: <- atoi_for2() = 0 4160/1@1: <- parse_time() = 0x51b257e0 4160/1: stat64("z", 0xF0770ED0) = 0 4160/1: d=0x08A00002 i=75783706 m=0100644 l=1 u=100 g=10 sz=0 4160/1: at = Jun 8 01:48:08 CEST 2013 [ 1370648888.022270973 ] 4160/1: mt = Jun 8 01:48:08 CEST 2013 [ 1370648888.022270973 ] 4160/1: ct = Jun 8 01:48:08 CEST 2013 [ 1370648888.022273810 ] 4160/1: bsz=4096 blks=0 fs=tmpfs 4160/1: utimensat(AT_FDCWD, "z", 0xF0770F60, 0) = 0 4160/1: at = Jun 8 00:00:00 CEST 2013 [ 1370642400.000000000 ] 4160/1: mt = Jun 8 00:00:00 CEST 2013 [ 1370642400.000000000 ] 4160/1@1: <- main() = 0 4160/1@1: -> _fini() 4160/1@1: <- _fini() = 0xebcc0140 4160/1: _exit(0)