GTKmm + pipe() не работает

У меня есть этот код:

#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, но даже когда я пишу коды read() и write() прямо перед частями gtkmm под close(), чтобы проверить функциональность чтения/записи в качестве теста для обхода вызовов функций, он все равно будет работать' т работать.

Единственная возможность, о которой я могу думать, это несовместимость между unistd.h и gtkmm.h.

(и также я знаю, что код в некоторой степени представляет собой кучу грязи в письменной форме, но это практика, забудьте об этом! ;-))

Большое спасибо за вашу помощь :-)


person Haix64    schedule 31.01.2012    source источник


Ответы (1)


Ваш код управления каналами неверен. Вы должны pipe() перед fork() убедиться, что оба файловых дескриптора унаследованы дочерним процессом. Почитайте документацию по этим функциям.

Вот довольно объемный туториал по Unix-программированию, ясно видно, что pipe() больше или меньше первого вызова перед запуском дочернего процесса.

person unwind    schedule 31.01.2012
comment
О БОЖЕ... Я просто редактировал код! Но все равно большое спасибо! - person Haix64; 31.01.2012