- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 GTK 新手,正在为连接到服务器的程序开发 GUI。我使用 fork
将逻辑(命令行客户端)与 GUI 分开。逻辑和GUI使用管道进行通信。
有时 GUI 会从管道中读取几条空消息,我不明白为什么。
我试图制作一个 SSCCE ,但我无法在我的简化示例中复制该问题。无论如何,程序大致是这样工作的:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <gtk/gtk.h>
int gui_pipe[2], logic_pipe[2];
gboolean deliver_signal(GIOChannel *source, GIOCondition cond, gpointer d) {
gchar readbuffer[100];
char ack[] = "ack";
read(gui_pipe[0], readbuffer, 100);
g_print("I received: %s\n",readbuffer);
write(logic_pipe[1], ack, strlen(ack));
return(TRUE);
}
main(int argc, char *argv[]) {
GtkBuilder *builder;
GtkWidget *window;
GIOChannel *g_signal_in;
if(pipe(gui_pipe)==-1) {
perror("pipe call");
exit(1);
}
if(pipe(logic_pipe)==-1) {
perror("pipe call");
exit(1);
}
switch(fork()) {
case -1:
perror("fork call");
exit(2);
case 0: /* Child (GUI) */
close(gui_pipe[1]);
close(logic_pipe[0]);
gtk_init(&argc, &argv);
builder = gtk_builder_new();
gtk_builder_add_from_file(builder, "mygui.glade", NULL);
window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
g_signal_in = g_io_channel_unix_new(gui_pipe[0]);
g_io_add_watch(g_signal_in, G_IO_IN, deliver_signal, NULL);
gtk_widget_show(window);
gtk_main();
default: /* Parent (Logic) */
close(gui_pipe[0]);
close(logic_pipe[1]);
char msg[] = "Hello!";
char readbuffer[100];
int i;
for(i=0;i<5;i++) {
printf("LOGIC: I'm sending %s\n",msg);
write(gui_pipe[1], msg, strlen(msg));
read(logic_pipe[0], readbuffer, 100);
printf("LOGIC: I received: %s\n", readbuffer);
}
exit(0);
}
}
这个版本不读取空管道,但原始程序会读取(总是 7 次!)。我找到的唯一解决方案是:
do {
read(gui_pipe[0], readbuffer, 100);
} while(strcmp("",readbuffer)==0);
我还尝试使用 g_io_channel_read_chars()
而不是 read()
但它也不起作用。
有什么建议吗?谢谢!
最佳答案
当您所显示的代码也已知可以工作时,这个问题很难回答。
您至少应该检查回调中的 condition
参数,也许有什么原因导致 non-read conditions在有问题的程序中报告?
关于c - 使用 GIOChannel 清空管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16689853/
这是我的一段代码。之后我会解释这个问题。 GIOStatus ret; GError *err = NULL; gchar *msg; gsize *len; ret = g_io_channel_r
我是 GTK 新手,正在为连接到服务器的程序开发 GUI。我使用 fork 将逻辑(命令行客户端)与 GUI 分开。逻辑和GUI使用管道进行通信。 有时 GUI 会从管道中读取几条空消息,我不明白为什
我正在树莓派上使用 GTK+ 编写 C 程序。有一个设备通过以太网端口与其耦合(所有 UDP 通信)。该设备向 pi 发送心跳,我可以接收该心跳。现在我需要将一些内容发送回设备。因此我需要知道它的IP
我是一名优秀的程序员,十分优秀!