Glib :: IOChannelのインスタンスが2つある場合、両方が書き込まれるまでブロックされます。これを行う正しい方法は何ですか?
質問
見つかった例を変更しましたここで2つのioチャンネルを使用します。両方のチャネルに書き込む前に、コールバックが呼び出されないようです。その後、それらはfifoに書き込むときに個別に呼び出されます。何かを忘れていますか?
- 1つのシェルウィンドウでテストプログラムを起動します。
- エコー<!> quot; abc <!> quot; <!> gt; 2番目のシェルウィンドウのtestfifo1。 -<!> gt;何も起こりません。
- エコー<!> quot; def <!> quot; <!> gt; 3番目のシェルウィンドウのtestfifo2。 -<!> gt;今<!> quot; abc <!> quot;および<!> quot; def <!> quot;
- いずれかのfifoに書き込みます。これはすぐに提供されます。
編集: 解決策は、以下のGormleyが示唆したように、ノンブロックがないことです。
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;
}
解決
これら2つのステートメントは、両方のfifoが発生するまでプログラムがメインループに入るのをブロックします 書き込み用に開いています。 fifoは、両側が接続されるまでブロックします
iochannel1 = Glib :: IOChannel :: create_from_fd(read_fd1); iochannel2 = Glib :: IOChannel :: create_from_fd(read_fd2);
所属していません StackOverflow