touch -t는 내부적으로 어떻게 작동하나요?

touch -t는 내부적으로 어떻게 작동하나요?

명령이 내부적으로 정확히 어떻게 작동합니까 touch -t? (소스 코드를 찾으려고 했지만 찾을 수 없었습니다.)

답변1

때로는 소스 코드가 필요하지 않은 경우도 있습니다. 사용 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따라서 파일 타임스탬프를 변경하고 이를 사용하여 파일의 타임스탬프를 업데이트하는 기능이 있습니다 . 이것이 내부적으로 작동하는 방식입니다.

답변2

touch~라고 불리는utimes파일의 수정 시간과 액세스 시간을 설정하는 시스템 호출입니다. 일부 시스템에서는 utimes파일을 연 다음 설명자를 통해 파일 시간을 설정하는 대신 다음을 사용합니다.utimensat리눅스에서.

touch시스템 호출을 보면 시스템이 어떻게 작동하는지 이해할 수 있습니다 . Linux에서는 다음을 사용하십시오.스트레스,예를 들어 strace touch -d '1 hour ago' foo.

소스 코드를 찾을 수 있는 위치는 운영 체제에 따라 다릅니다. GNU 버전은 다음 위치에 있습니다.핵심 도구, 모든 BSD에는 기본 소스 트리에 버전이 있습니다.바쁜 상자, 존재하다미닉스, 등.

답변3

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)

관련 정보