GTKmm + труба () не работает - PullRequest
       12

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

1 голос
/ 31 января 2012

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

#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.

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

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

1 Ответ

1 голос
/ 31 января 2012

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

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

...