วิธีการตรวจหาโดยทางโปรแกรมเมื่ออุปกรณ์ทำการขัดจังหวะ?


4

วิธีการตรวจหาโดยทางโปรแกรมเมื่ออุปกรณ์ทำการขัดจังหวะ? นี่อาจเป็นเมื่ออุปกรณ์เชื่อมต่อหรือตัดการเชื่อมต่อ

และในกรณีนี้เช่นเมื่อยกนิ้วสแกนลายนิ้วมือจะเกิดการขัดจังหวะ จะตรวจจับและดักจับอินเทอร์รัปต์นี้ได้อย่างไร

ฉันต้องการเขียนแอปพลิเคชันโดยใช้ Gtkmm เช่นเมื่อมีเหตุการณ์เกิดขึ้นเช่นซีดีที่ถูกแทรกหรือเสียบ pendrive ฉันจับอุปกรณ์ขัดจังหวะเหล่านี้ยกขึ้นและใช้เพื่อทำบางสิ่งบางอย่างในแอปพลิเคชันของฉันที่เกี่ยวข้องกับอุปกรณ์เหล่านี้

หากไม่สามารถทำได้ใน Gtkmm ฉันสามารถดัก Interrupt ในระดับที่ต่ำกว่าและแจ้งแอปพลิเคชัน Gtkmm ได้หรือไม่

ฉันกำลังตรวจสอบว่า GParted ทำงานอย่างไร มันเริ่มแสดง/dev/sdaและเมื่อฉันเชื่อมต่อ pendrive ของฉันมันเปิดfilesแอปพลิเคชันโดยอัตโนมัติ เมื่อฉันตรวจสอบ GParted แล้ว pendrive ไม่มีอยู่ในเมนูแบบเลื่อนลงของอุปกรณ์ มันปรากฏตัวเฉพาะเมื่อฉันเลือก“อุปกรณ์รีเฟรช” ในเมนูหรือ GParted +CtrlR


ไม่มีgtkmmแท็กเนื่องจากคำถามเกี่ยวกับที่อยู่ในกองซ้อนมากเกินไป อย่างไรก็ตามไลบรารี GTK ไม่ได้รวมฟังก์ชั่นประเภทนี้ไว้และนอกนั้นไม่มีการเรียกกลับคุณสามารถลงทะเบียนกับระบบได้
goldilocks

@goldilocks ฉันควรลบคำถามนี้และถามคำถามเดียวกันกับ Stack Overflow หรือไม่
user2555595

คุณสามารถทำได้แม้ว่าในขณะที่ฉันบอกว่าไม่มีฟังก์ชั่นดังกล่าวใน GTK หรือห้องสมุด C หรือ C ++ อื่น ๆ คำถามก็คือ "ฉันจะตรวจจับการเขียนโปรแกรมเมื่อเสียบอุปกรณ์ได้อย่างไร" ซึ่งไม่เป็นไรที่นี่ . ฉันจะได้คำตอบบางส่วนสำหรับคุณในหนึ่งนาที
goldilocks

@goldilocks, ตกลงฉันจะเปลี่ยนคำถามเป็นสิ่งที่คุณแนะนำ
user2555595

นี่เป็นคำตอบบางส่วนเนื่องจากเป็นเพียงคำตอบที่ตรวจพบเมื่ออุปกรณ์เชื่อมต่อหรือตัดการเชื่อมต่อ ผมพบว่าคำถามที่เกี่ยวข้องที่นี่ ดังนั้นการใช้Inotifyและการตรวจสอบไฟล์ที่กล่าวถึงโดยgoldilocksจะทำงานสำหรับการเปลี่ยนแปลงระบบไฟล์
user2555595

คำตอบ:


3

ฉันสามารถลองดัก Interrupt ที่ระดับต่ำกว่าและแจ้งแอปพลิเคชัน gtkmm

ไม่นั่นคือกิจกรรมในพื้นที่เคอร์เนล โชคดีที่เคอร์เนลรายงานผลลัพธ์ของเหตุการณ์บางอย่างผ่านอินเทอร์เฟซที่ผู้ใช้สามารถเข้าถึงได้

เป็นคำถามที่คลุมเครือเล็กน้อยในคำถามของคุณว่าคุณต้องการตรวจจับเมื่อติดตั้งอุปกรณ์บล็อกหรือเมื่อติดตั้งระบบไฟล์ (แม้ว่ามันจะเป็นแบบเก่ากว่าก็ตาม) หากระบบของคุณใช้การติดตั้งอัตโนมัติ (โดยปกติจะทำตามค่าเริ่มต้น) ระบบจะเมานต์ระบบไฟล์จากอุปกรณ์บล็อกเมื่อมีการเชื่อมต่อมิฉะนั้นคุณจะต้องดำเนินการด้วยตนเอง (เช่นด้วยmount)

ทั้งสองวิธีที่คุณต้องการที่จะสำรวจ / แยก / สแกนเคอร์เนลโหนดไฟล์อินเตอร์เฟซ ผมเคยทำแบบนี้มาก่อนในโปรแกรมประยุกต์ (c ++ GTK หนึ่งในความเป็นจริง) ที่ติดตามทั้งอุปกรณ์ป้องกันที่แนบมาและติดตั้งระบบไฟล์ผ่านทางและ/dev/ /etc/mtabนี่คือวิธีการที่ไม่เชื่อเรื่องภาษาและตรงไปตรงมา บางคนพบว่ามันน่ารังเกียจเล็กน้อยในตอนแรกเพราะมันเกี่ยวข้องกับการอ่านไฟล์ / ไดเรกทอรี แต่อินเตอร์เฟสเหล่านี้ไม่มีอยู่จริงบนดิสก์ดังนั้นจึงไม่มี I / O หนักมากและจำไว้ว่า: read()เป็นการเรียกของระบบ การอ่านโหนดไฟล์ในอินเทอร์เฟซของเคอร์เนลมีจำนวนเท่ากับlistAttachedDevices()API สไตล์ยกเว้นอีกครั้งเป็นภาษาที่ไม่เชื่อเรื่องพระเจ้า เมื่อคุณไปอ่านจากโหนดเหล่านี้เคอร์เนลจะส่งข้อมูลที่เป็นตัวแทนของคุณโดยตรง

/devรายการไดเรกทอรีอุปกรณ์ที่แนบเป็นไฟล์โหนดอุปกรณ์พิเศษ - /dev/sdaเช่น เคอร์เนลเหล่านี้ถูกเพิ่มและลบออกเนื่องจากมีการเสียบอุปกรณ์เข้าและออกดังนั้นหากคุณติดตามโดยการสำรวจเป็นระยะ ๆ (พูดทุก ๆ 5 วินาที) คุณสามารถตรวจสอบว่ามีอะไรใหม่และสิ่งที่หายไป ภาวะแทรกซ้อนเดียวที่นี่คือเนื่องจากไม่มี API สไตล์การติดต่อกลับคุณต้องสร้างเธรดของคุณเองสำหรับสิ่งนี้หากคุณต้องการตรวจสอบอย่างต่อเนื่อง (อาจเป็นเพราะเหตุใดgpartedคุณจึงต้องคลิกRefresh Devicesแทน)

ทางเลือกที่ดีกว่าน่า/devจะเป็นสิ่ง/sys/blockต่อไปนี้ โปรดทราบว่ามีความแตกต่างอย่างมีนัยสำคัญระหว่าง/devและ/proc(ดูด้านล่าง) หรือ/sys ในขณะที่โหนดในภายหลังมีข้อมูลเกี่ยวกับสิ่งต่าง ๆ เช่นอุปกรณ์ในขณะที่โหนดใน/devเป็นการเชื่อมต่อกับอุปกรณ์จริง (ดังนั้นหากคุณสแกน/devอย่า ' ไม่ต้องอ่านไฟล์แต่ละไฟล์แค่สังเกตว่ามีอยู่)

/etc/mtabnow-a-days เป็นsymlink (ดูที่-sสวิตช์ในman ln) เพื่อ/proc/self/mounts; /procเป็นส่วนต่อประสานเคอร์เนลมีดสวิสกองทัพใหญ่ (ดูman proc) รายการนี้filesystems ติดตั้ง ; หากคุณใช้สิ่งที่ติดตั้งอัตโนมัติจะปรากฏขึ้นและหายไปจากที่นั่นเมื่อสิ่งที่เสียบเข้า / ออก ข้อมูลใน/procและ/sysมักจะอยู่ในรูปแบบของข้อความ ASCII ดังนั้นคุณสามารถดูไฟล์เหล่านี้ด้วยcatฯลฯ และแยกวิเคราะห์ด้วยฟังก์ชันสตริง (สตรีม)

WRT ไปยังอุปกรณ์ประเภทอื่นเช่นเครื่องสแกนลายนิ้วมือ/sysเป็นจุดเริ่มต้นที่ดี - /sys/devมีblockและcharไดเรกทอรี อุปกรณ์บล็อคมักจะเก็บข้อมูล; ข้อมูลเกี่ยวกับพวกเขาสามารถเข้าถึงแบบสุ่ม อุปกรณ์ Char แลกเปลี่ยนข้อมูลกับระบบในสตรีมซึ่งจะรวมถึงสิ่งต่าง ๆ เช่นสแกนเนอร์กล้องสิ่งของ HID (อุปกรณ์อินเตอร์เฟสมนุษย์เช่นเมาส์และคีย์บอร์ด) ฉันสังเกตเห็นว่า gtkmm มีบางสิ่งระดับสูงสำหรับสิ่งที่แนบมากับ HID สันนิษฐานว่าเนื่องจากสิ่งเหล่านี้มีความสำคัญในการโต้ตอบกับ GUI


ขอบคุณมาก. มีบางสิ่งเกิดขึ้นบนหัวของฉัน :) จำเป็นต้องอ่านเกี่ยวกับสิ่งเหล่านี้ในรายละเอียดเพิ่มเติมเล็กน้อย
user2555595

0

goldilocksผมเห็นด้วยกับคำตอบจาก แต่แทนที่จะใช้การเรียกระบบreadเพื่อตรวจสอบการเปลี่ยนแปลงระบบไฟล์เราสามารถinotifyใช้ได้

หน้าคนของมันคือที่นี่และที่นี่

มีคำอธิบายที่ดีเยี่ยมและเป็นตัวอย่างโดยผู้สร้าง (พัฒนา) ก็คือที่นี่inotify

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.