2012-01-31 3 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 프로세스는 항목과 버튼이있는 창을 가져와 write() 기능을 사용하는 하위 수준 코드를 사용하여 항목의 내용을 보내고 부모는 수신 된 데이터를 표시하는 레이블이있는 창을 표시합니다 낮은 수준에서 read().

나는 gtkmm없이 달성 할 수 후,하지만 난이 close()에서 바로 gtkmm 부품 전에 read()write() 코드를 쓰기에도 바이 패스 함수 호출에 대한 테스트로 읽기/쓰기의 기능을 테스트하기 위해 정확한 기능, 여전히 작동하지 않습니다.

내가 생각할 수있는 유일한 가능성은 unistd.hgtkmm.h 사이의 비 호환성입니다.

는 는

(그리고 또한 내가 코드가 어느 정도 서면 먼지의 무리이지만, 그 연습은, 잊지! ;-) 알)

감사를 당신을 위해 너무 많이하는 것은 도움이 :-)

답변

1

파이프 관리 코드가 잘못되었습니다. 두 파일 기술자가 모두 하위 프로세스로 상속되었는지 확인하려면 pipe(),fork() 앞에 있어야합니다. 이 기능의 문서를 읽으십시오.

Here은 유닉스 프로그래밍에 대한 매우 조밀 한 튜토리얼입니다. 자식 프로세스를 시작하기 전에 pipe()이 처음 호출 된 것이 분명합니다.

+0

OH MY ... 코드를 편집하는 중이었습니다! 어쨌든 고마워요! – Haix64