gpt4 book ai didi

c++ - GTKmm + pipe() 不工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:09:09 24 4
gpt4 key购买 nike

我有这个代码:

#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 的内容,以及parent 打开一个只有一个 Label 的窗口,以显示使用 read() 在低级别接收到的数据。

我在没有 gtkmm 的情况下可以实现的确切功能,但即使我在 gtkmm 部分之前编写 read()write() 代码close() 来测试read/write 的功能作为绕过函数调用的测试,还是不行。

我能想到的唯一可能性是 unistd.hgtkmm.h 之间不兼容。

(而且我知道代码在某种程度上是一堆脏东西,但它是一种实践,忘记它!;-))

非常感谢您的帮助:-)

最佳答案

您的管道管理代码有误。您应该在 fork() 之前pipe() ,以确保两个文件描述符都继承到子进程中。阅读这些函数的文档。

Here是关于 Unix 编程的相当密集的教程,可以清楚地看到 pipe() 或多或少是在启动子进程之前进行的第一个调用。

关于c++ - GTKmm + pipe() 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9079570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com