إذا كان لدي حالتين من سطحي::IOChannel أنهم كتلة حتى كل خطية.ما هي الطريقة الصحيحة للقيام بذلك ؟
سؤال
لقد تعديل سبيل المثال وجدت هنا استخدام اثنين 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);
لا تنتمي إلى StackOverflow