إذا كان لدي حالتين من سطحي::IOChannel أنهم كتلة حتى كل خطية.ما هي الطريقة الصحيحة للقيام بذلك ؟

StackOverflow https://stackoverflow.com/questions/1043588

  •  20-08-2019
  •  | 
  •  

سؤال

لقد تعديل سبيل المثال وجدت هنا استخدام اثنين io فضائية.أيا من الاسترجاعات يبدو أن يسمى قبل كنت قد كتبت على كل القنوات.بعد أن ودعوا بشكل فردي عند كتابة إلى fifos.أنا نسيت شيء ؟

  • بدء برنامج اختبار في قذيفة واحدة نافذة.
  • كتابة صدى "abc" > testfifo1 في الثانية شل النافذة.-> لا شيء يحدث.
  • كتابة صدى "مواطنه" > testfifo2 في ثالث قذيفة النافذة.-> أنا الآن الحصول على "اي بي سي" و "ديف" ،
  • أكتب إلى أحد fifos.هذا هو يقدم فورا.

تحرير:الحل كما ألمح قبل غورملي أدناه ، كان عدم nonblock.

read_fd1 = open("testfifo1", O_RDONLY | O_NONBLOCK);
...
read_fd2 = open("testfifo2", O_RDONLY | O_NONBLOCK);

هذا تغيير التعليمات البرمجية أدناه جعلت الاستجابة فورا.

رمز:

#include <gtkmm/main.h>
#include <fcntl.h>
#include <iostream>

int read_fd1, read_fd2;
Glib::RefPtr<Glib::IOChannel> iochannel1, iochannel2;

// Usage: "echo "Hello" > testfifo<1|2>", quit with "Q"

bool MyCallback1(Glib::IOCondition io_condition)
{
    Glib::ustring buf;
    iochannel1->read_line(buf);
    std::cout << "io 1: " << buf;

    if (buf == "Q\n")
        Gtk::Main::quit();

    return true;
}

bool MyCallback2(Glib::IOCondition io_condition)
{
    Glib::ustring buf;
    iochannel2->read_line(buf);
    std::cout << "io 2: " << buf;

    if (buf == "Q\n")
        Gtk::Main::quit();

    return true;
}

int main(int argc, char *argv[])
{
    // the usual Gtk::Main object
    Gtk::Main app(argc, argv);

    if (access("testfifo1", F_OK) == -1)
    {
        if (mkfifo("testfifo1", 0666) != 0)
            return -1;
    }

    if (access("testfifo2", F_OK) == -1)
    {
        if (mkfifo("testfifo2", 0666) != 0)
            return -1;
    }

    read_fd1 = open("testfifo1", O_RDONLY);

    if (read_fd1 == -1)
        return -1;

    read_fd2 = open("testfifo2", O_RDONLY);

    if (read_fd2 == -1)
        return -1;

    Glib::signal_io().connect(sigc::ptr_fun(MyCallback1), read_fd1, Glib::IO_IN);
    Glib::signal_io().connect(sigc::ptr_fun(MyCallback2), read_fd2, Glib::IO_IN);

    iochannel1 = Glib::IOChannel::create_from_fd(read_fd1);
    iochannel2 = Glib::IOChannel::create_from_fd(read_fd2);

    app.run();

    if (unlink("testfifo1"))
        std::cerr << "error removing fifo 1" << std::endl;

    if (unlink("testfifo2"))
        std::cerr << "error removing fifo 2" << std::endl;

    return 0;
}
هل كانت مفيدة؟

المحلول

هذه بيانين منع البرنامج من الدخول في حلقة الرئيسية حتى fifos مفتوحة على الكتابة.fifos كتلة حتى كلا الجانبين على اتصال

iochannel1 = سطحي::IOChannel::create_from_fd(read_fd1);iochannel2 = سطحي::IOChannel::create_from_fd(read_fd2);

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