मेरे पास एक लिनक्स कैरेक्टर डिवाइस ड्राइवर है जो /dev/mything
एंट्री बनाता है, और फिर एक सी ++/क्यूटी प्रोग्राम जो डिवाइस खोलता है और इसका उपयोग करता है। यदि वह प्रोग्राम exit()
के साथ सही ढंग से बाहर निकलता है, तो डिवाइस बंद हो जाता है और ड्राइवर ठीक से रीसेट हो जाता है। लेकिन अगर कार्यक्रम असामान्य रूप से बाहर निकलता है, segfault या SIGINT
या कुछ के माध्यम से, डिवाइस ठीक से बंद नहीं होता है।एक लिनक्स कैरेक्टर डिवाइस ड्राइवर कैसे पता लगा सकता है जब इसका उपयोग करने वाला प्रोग्राम असामान्य रूप से बाहर निकलता है?
मेरा वर्तमान वर्कअराउंड ड्राइवर को फिर से लोड करना है अगर यह "खुले" राज्य में फंस जाता है।
ड्राइवर में इस लाइन एक साथ डिवाइस का उपयोग कर कई कार्यक्रमों को रोकने की कोशिश करता है:
int mything_open(struct inode* inode, struct file* filp) {
...
if (port->rings[bufcount].virt_addr) return -EBUSY;
...
}
तो यह साफ अप:
int mything_release(struct inode* inode, struct file* filp) {
...
port->rings[bufcount].virt_addr = NULL;
...
}
मुझे लगता है कि exit()
के नाम से जाना mything_release
लेकिन SIGINT
खड़ी कर रहा है नहीं है। मैं इस तरह की स्थिति में ड्राइवर को और अधिक मजबूत कैसे बना सकता हूं?
संपादित करें:
यहाँ संचालन मैं लागू कर दिया है कर रहे हैं। शायद मुझे कुछ याद आ रहा है?
static struct file_operations fatpipe_fops = {
.owner = THIS_MODULE,
.open = mything_open,
.release = mything_release,
.read = mything_read,
.write = mything_write,
.ioctl = mything_ioctl
};
जब प्रक्रियाएं निकलती हैं या समाप्त हो जाती हैं, तो कर्नेल संसाधनों को मुक्त कर देगा। किसी भी खुले फ़ाइल वर्णनकर्ताओं पर संदर्भ गणना शामिल है। – wildplasser
यदि ऐसा है, तो यह क्यों है कि मेरे प्रोग्राम के बाद SIGINT/segfault के साथ समाप्त हो जाता है, जब मैं प्रोग्राम को फिर से खोलने का प्रयास करता हूं तो मुझे 'डिवाइस या संसाधन व्यस्त' मिलता है? अगर मैं इसे साफ़ से बाहर निकलता हूं और इसे दोबारा खोलता हूं तो मुझे वह त्रुटि दिखाई नहीं देती है। – Dave
मुझे आपका कोड पता नहीं है। शायद आपके पास bufcount के लिए गलत मूल्य है? शायद आपने आवश्यक कार्यों में से एक को लागू नहीं किया है? – wildplasser