2012-01-31 165 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