를 작동하지 않는이 코드가 있습니다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.h
과 gtkmm.h
사이의 비 호환성입니다.
(그리고 또한 내가 코드가 어느 정도 서면 먼지의 무리이지만, 그 연습은, 잊지! ;-) 알)
감사를 당신을 위해 너무 많이하는 것은 도움이 :-)
OH MY ... 코드를 편집하는 중이었습니다! 어쨌든 고마워요! – Haix64