स्पर्श-स्पर्श आंतरिक रूप से कैसे काम करता है?


20

touch -tकमांड वास्तव में कैसे काम करता है, आंतरिक रूप से (मैंने इसके स्रोत कोड को खोजने की कोशिश की लेकिन नहीं कर सका)?

जवाबों:


23

touchutimesफ़ाइल के संशोधन समय और उसके एक्सेस समय को सेट करने के लिए सिस्टम कॉल को कॉल करता है। कुछ सिस्टम पर, इसके बजाय utimes, यह फाइल को खोलता है और फिर फाइल को डिस्क्रिप्टर के माध्यम से सेट करता है, जैसे utimensatलिनक्स के तहत।

आप touchअपने द्वारा किए गए सिस्टम कॉल को देखकर अपने सिस्टम पर कैसे काम कर सकते हैं, यह देख सकते हैं । लिनक्स के तहत, स्ट्रेस का उपयोग करें , उदा strace touch -d '1 hour ago' foo

स्रोत कोड कहां से प्राप्त करें यह आपके ऑपरेटिंग सिस्टम पर निर्भर करता है। जीएनयू संस्करण कोर्यूटिल्स में है , किसी भी बीएसडी के मुख्य स्रोत के पेड़ में एक संस्करण है , मिनिक्सिक्स आदि में बिजीबॉक्स में एक संस्करण है ।


28

कभी-कभी आपको सोर्स कोड की भी आवश्यकता नहीं होती है। का उपयोग करें 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एक फ़ाइल के टाइमस्टैम्प को अपडेट करने के लिए इसका उपयोग करता है। और यही वह आंतरिक रूप से काम करता है।


10

यहां बताया गया है कि यह सोलारिस पर कैसे काम करता है। 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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.