stat
সৃষ্টির সময় প্রদর্শনের অক্ষমতা stat(2)
সিস্টেম কলটির সীমাবদ্ধতার কারণে , যার রিটার্ন স্ট্রাক্ট নির্মাণের সময়টির জন্য কোনও ক্ষেত্র অন্তর্ভুক্ত করে না। লিনাক্স ৪.১১ (যেমন, ১..১০ এবং আরও নতুন *) দিয়ে শুরু করে, তবে নতুন statx(2)
সিস্টেম কল উপলব্ধ রয়েছে, যা তার রিটার্ন স্ট্রাক্টে একটি নির্মাণের সময় অন্তর্ভুক্ত করে।
* এবং সম্ভবত হার্ডওয়ার সক্ষমকরণ স্ট্যাক (HWE) কার্নেল ব্যবহার করে পুরানো এলটিএস রিলিজ। uname -r
আপনি নিশ্চিত হয়ে কমপক্ষে ৪.১১ ব্যবহার করে কার্নেল ব্যবহার করছেন কিনা তা পরীক্ষা করে দেখুন।
দুর্ভাগ্যক্রমে, কোনও সি প্রোগ্রামে সিস্টেম কলগুলি কল করা সহজ নয়। সাধারণত গ্লিবসি একটি মোড়ক সরবরাহ করে যা কাজটি সহজ করে তোলে তবে গ্লিবসি কেবল statx(2)
আগস্ট 2018 এর জন্য একটি মোড়ক যুক্ত করেছে (সংস্করণ 2.28 , 18.10 এ উপলব্ধ)। ভাগ্যক্রমে, @ হোয়াট ওয়াগনার একটি নমুনা সি প্রোগ্রাম লিখেছেন যা statx(2)
x86 এবং x86-64 সিস্টেমে সিস্টেম কলটি কীভাবে ব্যবহার করতে পারে তা দেখায় । এর আউটপুটটি stat
কোনও বিন্যাসের বিকল্প ছাড়াই ডিফল্ট হিসাবে একই ফর্ম্যাট , তবে এটি কেবল জন্মের সময় মুদ্রণের জন্য এটি পরিবর্তন করা সহজ।
প্রথমে এটি ক্লোন করুন:
git clone https://github.com/whotwagner/statx-fun
আপনি statx.c
কোডটি সংকলন করতে পারেন , বা আপনি যদি জন্মের সময়টি চান birth.c
তবে নীচের কোডটি দিয়ে ক্লোনযুক্ত ডিরেক্টরিতে একটি তৈরি করুন (যা statx.c
ন্যানোসেকেন্ড যথার্থতা সহ সৃজন টাইমস্ট্যাম্প মুদ্রণের নূন্যতম সংস্করণ ):
#define _GNU_SOURCE
#define _ATFILE_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include "statx.h"
#include <time.h>
#include <getopt.h>
#include <string.h>
// does not (yet) provide a wrapper for the statx() system call
#include <sys/syscall.h>
/* this code works ony with x86 and x86_64 */
#if __x86_64__
#define __NR_statx 332
#else
#define __NR_statx 383
#endif
#define statx(a,b,c,d,e) syscall(__NR_statx,(a),(b),(c),(d),(e))
int main(int argc, char *argv[])
{
int dirfd = AT_FDCWD;
int flags = AT_SYMLINK_NOFOLLOW;
unsigned int mask = STATX_ALL;
struct statx stxbuf;
long ret = 0;
int opt = 0;
while(( opt = getopt(argc, argv, "alfd")) != -1)
{
switch(opt) {
case 'a':
flags |= AT_NO_AUTOMOUNT;
break;
case 'l':
flags &= ~AT_SYMLINK_NOFOLLOW;
break;
case 'f':
flags &= ~AT_STATX_SYNC_TYPE;
flags |= AT_STATX_FORCE_SYNC;
break;
case 'd':
flags &= ~AT_STATX_SYNC_TYPE;
flags |= AT_STATX_DONT_SYNC;
break;
default:
exit(EXIT_SUCCESS);
break;
}
}
if (optind >= argc) {
exit(EXIT_FAILURE);
}
for (; optind < argc; optind++) {
memset(&stxbuf, 0xbf, sizeof(stxbuf));
ret = statx(dirfd, argv[optind], flags, mask, &stxbuf);
if( ret < 0)
{
perror("statx");
return EXIT_FAILURE;
}
printf("%lld.%u\n", *&stxbuf.stx_btime.tv_sec, *&stxbuf.stx_btime.tv_nsec);
}
return EXIT_SUCCESS;
}
তারপর:
$ make birth
$ ./birth ./birth.c
1511793291.254337149
$ ./birth ./birth.c | xargs -I {} date -d @{}
Mon Nov 27 14:34:51 UTC 2017
তত্ত্বগতভাবে এটি সৃষ্টির সময়টিকে আরও অ্যাক্সেসযোগ্য করে তুলবে:
- কেবল এক্সট * টির চেয়ে বেশি ফাইল সিস্টেমগুলি সমর্থন করা উচিত (
debugfs
এটি ext2 / 3/4 ফাইল সিস্টেমগুলির জন্য একটি সরঞ্জাম এবং অন্যের জন্য অপ্রয়োজনীয়)
- এটি ব্যবহার করার জন্য আপনার মূলের দরকার নেই (কিছু প্রয়োজনীয় প্যাকেজ ইনস্টল করা বাদে,
make
এবং linux-libc-dev
)।
একটি এক্সএফএস সিস্টেম পরীক্ষা করা হচ্ছে, উদাহরণস্বরূপ:
$ truncate -s 1G temp; mkfs -t xfs temp; mkdir foo; sudo mount temp foo; sudo chown $USER foo
$ touch foo/bar
$ # some time later
$ echo > foo/bar
$ chmod og-w foo/bar
$ ./birth foo/bar | xargs -I {} date -d @{}
Mon Nov 27 14:43:21 UTC 2017
$ stat foo/bar
File: foo/bar
Size: 1 Blocks: 8 IO Block: 4096 regular file
Device: 700h/1792d Inode: 99 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ muru) Gid: ( 1000/ muru)
Access: 2017-11-27 14:43:32.845579010 +0000
Modify: 2017-11-27 14:44:38.809696644 +0000
Change: 2017-11-27 14:44:45.536112317 +0000
Birth: -
তবে এটি এনটিএফএস এবং এক্সফেটের জন্য কার্যকর হয়নি। আমি অনুমান করি যেগুলির জন্য ফুস ফাইল সিস্টেমগুলি তৈরির সময় অন্তর্ভুক্ত করে নি।
যদি বা পরিবর্তে, গ্লিবসি statx(2)
সিস্টেম কলের জন্য সমর্থন যোগ করে , stat
শীঘ্রই অনুসরণ করা হবে এবং আমরা এর জন্য প্লেইন পুরাতন stat
কমান্ডটি ব্যবহার করতে সক্ষম হব । তবে আমি মনে করি না যে এটি এলটিএস রিলিজগুলিতে আরও নতুন কার্নেল পেলে ব্যাকপোর্ট করা হবে। তাই, আমি আশা করি না stat
উপর কোনো বর্তমান LTS রিলিজ কি কখনো ম্যানুয়াল হস্তক্ষেপ ছাড়াই সৃষ্টি সময় প্রিন্ট করতে (14.04, 16,04 বা 18.04)।
১৮.১০-তে, তবে আপনি সরাসরি statx
বর্ণিত ফাংশনটি সরাসরি ব্যবহার করতে পারেন man 2 statx
(দ্রষ্টব্য যে 18.10 ম্যানপেজটি ভুলভাবে আবশ্যক যে গ্লিবসি এখনও মোড়কে যুক্ত করে নি)।