আপনার সচেতন হওয়া উচিত যে আপনার যখন সম্ভব সম্ভব লিনাক্স কার্নেল থেকে ফাইল I / O এড়ানো উচিত। মূল ধারণাটি হ'ল "এক স্তর আরও গভীর" এবং সরাসরি সিসকল হ্যান্ডলারের পরিবর্তে ভিএফএস স্তর ফাংশনগুলি কল করা:
অন্তর্ভুক্ত:
#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>
একটি ফাইল খোলার (খোলার অনুরূপ):
struct file *file_open(const char *path, int flags, int rights)
{
struct file *filp = NULL;
mm_segment_t oldfs;
int err = 0;
oldfs = get_fs();
set_fs(get_ds());
filp = filp_open(path, flags, rights);
set_fs(oldfs);
if (IS_ERR(filp)) {
err = PTR_ERR(filp);
return NULL;
}
return filp;
}
একটি ফাইল বন্ধ করুন (বন্ধের সমান):
void file_close(struct file *file)
{
filp_close(file, NULL);
}
কোনও ফাইল থেকে ডেটা পড়া (প্রিডের সমান):
int file_read(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size)
{
mm_segment_t oldfs;
int ret;
oldfs = get_fs();
set_fs(get_ds());
ret = vfs_read(file, data, size, &offset);
set_fs(oldfs);
return ret;
}
কোনও ফাইলে ডেটা লিখন (প্যারাইটের অনুরূপ):
int file_write(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size)
{
mm_segment_t oldfs;
int ret;
oldfs = get_fs();
set_fs(get_ds());
ret = vfs_write(file, data, size, &offset);
set_fs(oldfs);
return ret;
}
সিঙ্ক করার ফলে একটি ফাইল পরিবর্তন হয় (ফাইএনসিঙ্কের অনুরূপ):
int file_sync(struct file *file)
{
vfs_fsync(file, 0);
return 0;
}
[সম্পাদনা] মূলত, আমি file_fsync ব্যবহার করার প্রস্তাব দিয়েছিলাম, যা নতুন কার্নেল সংস্করণে রয়েছে। দরিদ্র লোকটিকে পরিবর্তনের প্রস্তাব দেওয়ার জন্য ধন্যবাদ, তবে যার পরিবর্তনটি প্রত্যাখ্যান করা হয়েছিল। সম্পাদনাটি আমি পর্যালোচনা করার আগেই তা প্রত্যাখ্যান করা হয়েছিল।