উত্তর:
touchutimesফাইলটির পরিবর্তনের সময় এবং এর অ্যাক্সেসের সময় সেট করতে সিস্টেম কলকে কল করে । কিছু সিস্টেমে পরিবর্তে utimesএটি ফাইলটি খোলে এবং তারপরে বর্ণনাকারীর মাধ্যমে ফাইলের সময় নির্ধারণ করে যেমন utimensatলিনাক্সের আওতায়।
touchআপনার সিস্টেমে এটির কলগুলি দেখে আপনার সিস্টেমে কীভাবে কাজ হয় তা আপনি দেখতে পারেন । লিনাক্সের অধীনে স্ট্রেস ব্যবহার করুন , যেমন strace touch -d '1 hour ago' foo।
উত্স কোডটি কোথায় পাওয়া যায় তা আপনার অপারেটিং সিস্টেমের উপর নির্ভর করে। জিএনইউ সংস্করণটি কোর্টিলগুলিতে রয়েছে , কোনও বিএসডি-র মূল উত্স ট্রিতে একটি সংস্করণ রয়েছে, বুসিবক্সে , মিনিক্সে ইত্যাদির একটি সংস্করণ রয়েছে etc.
কখনও কখনও আপনার এমনকি সোর্স কোডের প্রয়োজন হয় না। ব্যবহার 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একটি ফাইলের টাইমস্ট্যাম্প আপডেট করার জন্য এটি ব্যবহার করে। এবং এভাবেই এটি অভ্যন্তরীণভাবে কাজ করে।
সোলারিসে এটি কীভাবে কাজ করে তা এখানে। 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)