c - Moving from create_proc_read_entry to proc_create and using seq_files -
मैं तो मैं क्या करने की कोशिश कर रहा हूँ, मेरे स्ट्रक्चर को seq_show फ़ंक्शन से सूचक को पकड़ लेता है, लेकिन यह काम नहीं कर रहा है। यह सिर्फ एक पहला प्रयास है जब मैं इस कोड की कोशिश करता हूँ तो मैं पिक्से करता हूं जब मैं संरचना के कमांड सदस्य को बदल देता हूं। जैसा कि आप देख सकते हैं कि मेरा स्ट्रेट बहुत छोटा है, ऐसा नहीं है, इस कार्यान्वयन को सीक फाइलों का उपयोग करना होगा ताकि यह जांच सके कि यह दूसरे पेज पर चल रहा है या नहीं। यही कारण है कि मैंने शो फ़ंक्शन में पॉइंटर को पकड़ने की कोशिश की क्योंकि मुझे लगता था कि इसे पुनरावृत्त करना होगा या संरचना या पृष्ठ पर "अगला" होगा मैंने जो सीक_फ़ाइल पुनरावृत्ति पढ़ी है, उससे स्ट्रैक्ट्स के माध्यम से फिर से करना आसान हो जाएगा परन्तु मुझे सबसे पहले यह समझने की ज़रूरत है कि मैं उपयोगकर्ता कोड से आप लेकिन किसी भी मामले में, procfs कार्यों को proc_create create_proc_read_entry से स्थानांतरित करने की कोशिश कर रहा / कोड>। मैं नए कार्यान्वयन में शोध कर रहा हूं जो seq_files का उपयोग करता है। इससे पहले कि मैं एक
copy_from_user को कर्नेल स्पेस में एक सूचक को पास करने के लिए
/ proc फाइल सिस्टम का उपयोग कर रहा था इस संरचना में उसमें जानकारी (और अन्य डेटा) है जिसका उपयोग मैं यह निर्धारित करने के लिए करता हूं कि फ़ंक्शन को आगे क्या कहा जाता है मैं नए कार्यान्वयन के साथ संघर्ष कर रहा हूँ विशेष रूप से मैं उस पॉइंट को संरचना के लिए कैसे प्राप्त कर सकता हूं जिसे यूजर स्पेस से पारित किया जाता है। मेरे शोध से seq_files कार्यान्वयन सूचक सामग्री से निपटने के बिना संरचनाओं के माध्यम से आसानी से पुनरारंभ करने के लिए seq फ़ाइलों का उपयोग करता है। <पूर्व>
struct sCmd_t {u32 लंबाई; यू 8 प्रकार; इंट नंबर; U16 आदेश; यू 8 संस्करण; } SCmd_t ctrl_file = create_proc_read_entry ("ctrl", 0666, PROC_FILE, read_proc_ctrl, NULL); Ctrl_file- & gt; write_proc = write_proc_ctrl; स्थैतिक इं write_proc_ctrl (स्ट्रेट फ़ाइल * filp, const char __user * buff, अहस्ताक्षरित लंबे समय से, शून्य * डेटा) {sCmd_t * sCmd = NULL; Const अहस्ताक्षरित चार * curbuf = NULL; SCmd = (sCmd_t *) किमीलोक (आकारफ (sCmd_t), जीएफपी_केअरएनएल); अगर (एससीएमडी == नल) वापसी त्रुटि; मेमेटसेट (सीएमडी, 0, साइकोफ (एससीएमडी)); Curbuf = buff; अगर (copy_from_user (सीएमडी, क्यूब्यूफ़, साइकोफ (एससीएमडी_टी))) रिटर्न -इफ़ाल्ट; स्विच (sCmd- & gt; कमांड) {// कमांड के आधार पर उपयुक्त}
स्थिर int seq_show (struct seq_file * seqfile, void * v) {// में यहाँ मैं संरचना के लिए एक सूचक को पकड़ने की कोशिश कर रहा हूँ यहाँ sCmd_t * sCmd = NULL; Const अहस्ताक्षरित चार * curbuf = NULL; SCmd = (sCmd_t *) किमीलोक (आकारफ (sCmd_t), जीएफपी_केअरएनएल); अगर (एससीएमडी == नल) वापसी त्रुटि; मेमेटसेट (सीएमडी, 0, साइकोफ (एससीएमडी)); Curbuf = v; यदि (copy_from_user (सीएमडी, क्यूब्यूफ़, साइकोफ (sCmd_t))) / ब्ला ब्ला ब्ला ..... वापस 0; } स्थिर शून्य * seq_start (स्ट्रेट seq_file * seqfile, loff_t * pos) {वापसी स्थिति; } स्थिर शून्य * seq_next (स्ट्रेट seq_file * seqfile, शून्य * v, loff_t * pos) {वापसी स्थिति; } स्थिर शून्य seq_stop (स्ट्रेट seq_file * seqfile, शून्य * v) {वापसी; } स्थिर संरचना seq_operations seq_ops = {.start = seq_start, .next = seq_next, .stop = seq_stop, .show = seq_show}; स्थिर इंट proc_open (स्ट्रक्चर इनोड * इनोड, स्ट्रक्चर फ़ाइल * फ़ाइल) {वापसी seq_open (फ़ाइल, और amp; seq_ops); } स्थिर संविधान फ़ाइल file_operations fops = {.owner = THIS_MODULE, .open = proc_open, .read = seq_read, .llseek = seq_lseek, .release = single_release,}; Ctrl_file = proc_create ("ctrl", 0644, proc_dir, और amp; fops);
/ proc फाइल सिस्टम को कैसे लिखूं। / P>
seq_file केवल पढ़ने के लिए फ़ाइल को लागू करने के लिए एक सहायक है
शो कॉलबैक का बफर एक कर्नेल बफर है, जहां आप उस डेटा को लिखना चाह रहे हैं जो कि यूजर स्पेस में वापस किया जाना है।
seq_file , या नहीं; लेकिन इसका मतलब यहां नहीं होगा।
struct file_operations से परिभाषित किया जाता है; एक लेखन कॉलबैक लागू करने के लिए, बस
लिखना में
fops को कार्यान्वित करें।
Comments
Post a Comment