无法从管道中读取数据

z362752011 2009-12-28 04:23:41
本人有个linuxC语言的程序,想设计成核心程序独立,不需图形界面,然后在基于核心程序开发图形界面。故打算使用linux的管道,将文件描述符给重定向来进行核心程序的输出与输入的交互,但是现在遇到的问题却是无法读取数据的问题,代码如下,望高手回答。部分代码如下:
static int pipe_stdout[2],pipe_stdin[2],pipe_stderr[2];
int message_box(char *message,char *title,GtkMessageType message_type,GtkButtonsType button_type);
gboolean init_bridge()
{
int pid=0;
if(pipe(pipe_stdout)||pipe(pipe_stdin)||pipe(pipe_stderr))
{
if(message_box("Interface initialisation error","error",GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE)==GTK_RESPONSE_CLOSE)
return FALSE;
}
if(dup2(pipe_stdout[1],STDOUT_FILENO)==-1||dup2(pipe_stdin[0],STDIN_FILENO)==-1||dup2(pipe_stderr[1],STDERR_FILENO)==-1)
{
if(message_box("Interface initialisation error","error",GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE)==GTK_RESPONSE_CLOSE)
return FALSE;
}
pid=fork();
if(pid<0)
{
if(message_box("Interface initialisation error","error",GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE)==GTK_RESPONSE_CLOSE)
return FALSE;
}else if(pid==0)
{//child process
close(pipe_stdout[0]);
close(pipe_stdin[1]);
close(pipe_stderr[0]);
execl("Authentication",NULL);
exit(0);
}
else//parent process
{
char buf[1024];
close(pipe_stdout[1]);
close(pipe_stdin[0]);
close(pipe_stderr[1]);
read(pipe_stdout[0],buf,1024); //这里会阻塞,而读不到数据
}
return TRUE;
}

...全文
173 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
BABY 2009-12-28
  • 打赏
  • 举报
回复
搞不懂 pipe_stdin 连来连去做什么……
z362752011 2009-12-28
  • 打赏
  • 举报
回复
网上找了下,找到原因了!
是由于管道中的数据在使用文件描述符和文件流指针的差异造成的问题,文件描述符直接进入管道,FILE*会有缓冲流!
给分吧!反正分都挂着了,不给还不如给!
z362752011 2009-12-28
  • 打赏
  • 举报
回复
真的想求解,顶一下!
z362752011 2009-12-28
  • 打赏
  • 举报
回复
我只是想将子进程的标准输出和错误输出重定向到父进程,子进程的标准输入从父进程那里重定向过来读取

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧