سؤال

أحاول تنفيذ أمر ioctl من خلال إطار عمل Mono، لكن لا يمكنني العثور على ما أبحث عنه.

أحاول إرسال أمر إلى بطاقة DVB التي تحتوي على وحدة kernel.آمل أن يتمكن شخص ما من الارتباط أو الشرح بوضوح كيف يمكن القيام بذلك.أعتقد أن أي مثال مع Mono باستخدام وحدات kernel سيكون مفيدًا.

هل كانت مفيدة؟

المحلول

لا يحتوي Mono على غلاف لـ ioctl في Mono.Unix، لأن معلمات استدعاء ioctl تختلف بشكل كبير وسيكون مثل هذا الغلاف عديم الفائدة تقريبًا.يجب أن تعلن أ DllImport لكل ioctl تحتاجه.

ربما لا تحتاج إلى مكتبة مساعدة مكتوبة بلغة C، ومع ذلك، قد تحتاج إليها أثناء التطوير لاستخراج القيم الفعلية المخفية خلف وحدات ماكرو مختلفة للمعالج الأولي للغة C.على سبيل المثال، لتوسيع رأس C:

#define FE_GET_INFO                _IOR('o', 61, struct dvb_frontend_info)

تجميع وتنفيذ هذا المساعد:

#include <linux/dvb/frontend.h>
#include <stdio.h>

int main()
{
  printf("const int FE_GET_INFO = %d;\n", FE_GET_INFO);
  return 0;
}

مناقشة قصيرة لقائمة بريدية أحادية حول هذا الموضوع.

نصائح أخرى

لا تدعم IOCTL التي كتبها مونو AFAIK. يعتمد أيضا OS محددة وقائمة المعلمة على الطلب الفعلي. قد تتمكن من محاولة DLLImport

إمكانية التشغيل المتداخل مع المكتبات الأصلية

ويجب عليك أن تكتب مكتبة المجمع للمكالمات بالضبط. انظروا كيف يلتف Mono.Unix syscalls (جوجل تكون قيمة codesearch لMono.Unix Syscall.cs) للحصول على هذه الفكرة. قم بإنشاء مجمع لكل أمر IOCTL معين، والذي يستخدم التمثيل الخاصة بك من البيانات.

وكما قال غضب - ستحتاج إلى DLLImport وIOCTL نفسها

وتحقق لبلدي مسألة مماثلة ، والسؤال لاحق على في subject . في هذه الحالة أحاول التفاف واجهة Videl4Linux، التي يمكن أن تكون ذات فائدة بالنسبة لك.

وأقترح حقا تلك القراءات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top