1
我有這樣的代碼:的gtkmm +管道()不工作
#include <gtkmm.h>
#include <unistd.h>
void send_msg(Gtk::Entry* entry, int* fd);
Glib::ustring* receive_msg(int* fd);
bool handle_msg(Gtk::Label* lbl, int* fd);
int main()
{
pid_t pid = fork();
int fd[2];
pipe(fd);
Gtk::Main gtkmain;
Gtk::Window* win;
Glib::RefPtr<Gtk::Builder> builder;
if (pid > 0)
{
close(fd[1]);
builder = Gtk::Builder::create_from_file("parent.glade");
builder->get_widget("parentwin", win);
Gtk::Label* lbl;
builder->get_widget("label", lbl);
sigc::slot<bool> timer = sigc::bind(sigc::ptr_fun(&handle_msg), lbl, fd);
Glib::signal_timeout().connect(timer, 1000);
}
else if (pid == 0)
{
close(fd[0]);
builder = Gtk::Builder::create_from_file("child.glade");
builder->get_widget("childwin", win);
Gtk::Button* send;
Gtk::Entry* txt;
builder->get_widget("send", send);
builder->get_widget("msg", txt);
send->signal_clicked().connect(sigc::bind(sigc::ptr_fun(&send_msg), txt, fd));
}
Gtk::Main::run(*win);
return EXIT_SUCCESS;
}
void send_msg(Gtk::Entry* entry, int* fd)
{
Glib::ustring msg = entry->get_text();
const char* c_msg = msg.c_str();
int i = 0;
char* c = new char(0);
while (*c = c_msg[i++])
{
write(fd[1], c, 1);
}
}
Glib::ustring* receive_msg(int* fd)
{
Glib::ustring* msg = new Glib::ustring;
char* c = new char(0);
do
{
read(fd[0], c, 1);
msg->append(c);
} while (*c);
return msg;
}
bool handle_msg(Gtk::Label* lbl, int* fd)
{
Glib::ustring* msg;
msg = receive_msg(fd);
lbl->set_text(*msg);
// delete msg;
return true;
}
,它的目的是這樣的: 整個程序的工作原理類似於一個聊天程序,只是不適合那個。 child
進程會彈出一個窗口,其中包含一個Entry和一個Button,使用一個使用write()
函數的低級代碼發送Entry的內容,並且父窗口將顯示一個僅帶有Label的窗口,以顯示接收到的數據在低水平與read()
。
那我以後,我可以不gtkmm的實現,但即使我之前的gtkmm權部分寫close()
下read()
和write()
代碼來測試讀取的功能/寫一個測試,以旁路函數調用的確切功能,它仍然無法工作。
我能想到的唯一可能性是unistd.h
和gtkmm.h
之間的不兼容性。
(也是我知道的代碼是一堆的書面污垢,在一定程度上,但其做法,忘記了!;-))
非常感謝您的幫助:-)
OH MY ... 我只是在編輯代碼!但非常感謝! – Haix64 2012-01-31 12:41:59