2012-01-31 86 views
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.hgtkmm.h之间的不兼容性。

(也是我知道的代码是一堆的书面污垢,在一定程度上,但其做法,忘记了!;-))

非常感谢您的帮助:-)

回答

1

你的管道管理代码是错误的。你应该pipe()之前fork(),以确保两个文件描述符被继承到子进程。阅读这些功能的文档。

Here是关于Unix编程的一个非常密集的教程,很明显pipe()或多或少是第一次调用,在启动子进程之前。

+0

OH MY ... 我只是在编辑代码!但非常感谢! – Haix64 2012-01-31 12:41:59