2013-12-21 82 views
0

utimes(2)이 시스템 호출이고 futimes(3)이 라이브러리 함수라고 가정하면 futimesutimes으로 구현되었다고 생각합니다. 그러나 utimes은 경로 이름을 사용하는 반면 futimes파일 설명자인을 사용합니다.fimes를 utimes와 관련하여 구현하는 방법은 무엇입니까?

는이 작업을 수행 할 수있는 방법을 파일 기술자 또는 i- 노드 번호 궁금에서 경로 이름을 결정하기 위해 "불가능"입니다, 이후? "실제"시스템 호출이 항상 i-node 번호에서 작동합니까?

답변

0

첫 번째로 후자가 시스템 호출과 라이브러리 기능을 다르기 때문에 Posix를 잘못 언급했을 가능성이 있습니다. futimes()를 라이브러리 호출에 사용하는 것은 Linux에만 해당됩니다.

/* Change the access time of the file associated with FD to TVP[0] and 
    the modification time of FILE to TVP[1]. 

    Starting with 2.6.22 the Linux kernel has the utimensat syscall which 
    can be used to implement futimes. Earlier kernels have no futimes() 
    syscall so we use the /proc filesystem. */ 

그래서,이 기준 모두를위한 하나로서 지정된 기술자 utimensat()를 사용하여 수행됩니다 * : glibc는 (파일 sysdeps/유닉스/SYSV/리눅스/futimes.c)에서, 주석이 at() 호출. 이전에는/proc/$ {pid}/fd/$ {fd} 경로에 utimes()를 사용하여 작업했습니다 (/ proc가 마운트 된 경우에만 너무 번거롭고). 이는 두 번째 질문에 대한 답입니다. 일반적으로 설명자에서 파일 이름을 감지 할 수는 없지만 별도로 파일에 액세스 할 수 있습니다. (BTW, 리눅스 프로세스의 경우/proc/$ pid/{cwd, exe}를 보면 파일을 여는 데 사용되는 초기 경로가 때때로 저장됩니다.)

FreeBSD는 명시적인 futimes()와 futimesat) syscalls (하지만 나는 왜 후자의 이름이 "utimesat"이 아닌지 궁금해한다).