سؤال

نحن نقوم بنقل رمز Windows الحالي إلى Linux. نحن نستخدم ACE كطبقة التجريد. نحن نستخدم Windows المسماة أنابيب للتواصل مع عملاء متعددين ولإجراء عمليات متداخلة.

ما هو ما يعادل هذا في لينكس. لقد راجعت Linux المسماة Pipes (FIFO) ، لكن يبدو أنها تدعم عميل وخادم واحد فقط ولا تدعم IO المتداخلة.

هل يمكنك إرشادي بخصوص هذا.

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

المحلول

مآخذ يونيكس. بشكل أساسي،

  1. مكالمة socket(PF_UNIX, SOCK_STREAM, 0). هذا يعيد واصف ملف أو -1 على خطأ.
  2. استخدم شيئًا مثل struct sockaddr_un addr; bzero(addr); addr.sun_len = sizeof(addr); addr.sun_family = PF_UNIX; strncpy(addr.sun_path, "/path/to/file", sizeof(addr.sun_path)-1); لإنشاء عنوان المقبس.
  3. مكالمة bind(fd, &addr, sizeof(addr)).
  4. مكالمة listen(fd,backlog) للاستماع للاتصالات. backlog هو عدد اتصالات un-accept () ed التي يمكن أن توجد.
  5. استخدم قبول () لقبول الاتصالات من العملاء. هذا يعيد FD أو -1 على خطأ.
  6. اطلب من العملاء إنشاء مأخذ توصيل مشابه و Connect () بالعنوان (لا أعتقد أن عليهم ربط).
  7. قم بإزالة الملف/المسار/إلى/ملف عند الانتهاء (أو اتركه هناك إذا كنت ستعيد استخدامه لاحقًا).

لست متأكدًا مما إذا كان Sock_dgram مدعومًا لمآخذ Unix (إذا كان الأمر كذلك ، فمن المحتمل أن يكون يشبه UDP).

راجع صفحات الرجل للمقبس (2) ، ربط (2) ، استمع (2) ، قبول (2) ، الاتصال (2) ، UNIX (4) ، setSockopt (2).

لصالح "I/O متداخل" ، انظر Select (2). يمكنك بالإضافة إلى ذلك تمكين IO غير الحظر مع fcntl(fd,F_SETFL,(int)(fcntl(fd,F_GETFL)|O_NONBLOCK)) (انظر FCNTL (2)) ، وهذا يعني القراءة () والكتابة () لا تقم أبدًا بحظر (مما يعني أن الكتابة () يمكن أن تعود قصيرة ، لذلك تحتاج إلى إلقاء نظرة على قيمة الإرجاع).

لست متأكدًا تمامًا من كيفية تمثيل الأنابيب المسماة Windows التي تمثل اتصالات متعددة من عملاء متعددين ، ولكن في UNIX ، تحصل على واصف ملف واحد لكل اتصال (بالإضافة إلى واحد لمقبس "الاستماع").

نصائح أخرى

أعتقد أنهم يقومون بشوكة () و Stdin/stdout و/أو مآخذ ، إذا كنت أتذكر. لقد قمت بذلك في Python ولكن يحتوي على غلاف IPC عالي المستوى جدًا ، لذا لست متأكدًا من كيفية عمله بالضبط على *nix.

ما أنا متأكد منه هو أنه لا يوجد شيء مثل I/O متداخل ، على الأقل ليس كما هو موجود في Windows. كما تمتص Primitives Locking أيضًا مقارنة بالنوافذ ، على الرغم من أن أشياء المقبس تميل إلى أن تتصرف بشكل أفضل.

لذا انظر إلى fork() والأشياء ذات الصلة IPC من حوله. قد ترغب في الاستثمار في الخير المرجعي كذلك. أعتقد أن هذا الكتاب يعادل هارت تومي في ويندوز.

إذا كان التواصل محليًا ، فاستخدم مآخذ النطاق UNIX أو مآخذ TCP. يمكن أن تتلقى مآخذ DOMAIN UNIX بيانات اعتماد عملية الاتصال.

إذا كان على شبكة استخدم مآخذ TCP.

لاحظ أن بعض ميزات Windows المسماة غير مدعومة - لا يمكنك تمرير بيانات الاعتماد عبر مقبس TCP ، لذلك ستحتاج إلى هندسة بروتوكولك حتى لا تتطلبها.

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