কীভাবে স্পর্শ-টি অভ্যন্তরীণভাবে কাজ করে?


20

touch -tকমান্ডটি অভ্যন্তরীণভাবে ঠিক কীভাবে কাজ করে (আমি এর উত্স কোডটি সন্ধান করার চেষ্টা করেছি কিন্তু পারি নি)?

উত্তর:


23

touchutimesফাইলটির পরিবর্তনের সময় এবং এর অ্যাক্সেসের সময় সেট করতে সিস্টেম কলকে কল করে । কিছু সিস্টেমে পরিবর্তে utimesএটি ফাইলটি খোলে এবং তারপরে বর্ণনাকারীর মাধ্যমে ফাইলের সময় নির্ধারণ করে যেমন utimensatলিনাক্সের আওতায়।

touchআপনার সিস্টেমে এটির কলগুলি দেখে আপনার সিস্টেমে কীভাবে কাজ হয় তা আপনি দেখতে পারেন । লিনাক্সের অধীনে স্ট্রেস ব্যবহার করুন , যেমন strace touch -d '1 hour ago' foo

উত্স কোডটি কোথায় পাওয়া যায় তা আপনার অপারেটিং সিস্টেমের উপর নির্ভর করে। জিএনইউ সংস্করণটি কোর্টিলগুলিতে রয়েছে , কোনও বিএসডি-র মূল উত্স ট্রিতে একটি সংস্করণ রয়েছে, বুসিবক্সে , মিনিক্সে ইত্যাদির একটি সংস্করণ রয়েছে etc.


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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.