【发布时间】:2014-11-12 04:44:45
【问题描述】:
我有以下代码:
switch(fork())
{
case -1:
/*error case*/
error = errno;
printf("fork error(1): %s\n", strerror(error));
break;
case 0: //child case: execute remove_non_alpha and send result to pfd write end
remove_non_alpha(arg_str);
res = write(pfd[1], arg_str, arg_str_size);
if(res != arg_str_size)
{
return -1;
}
char *arg_str2 = NULL;
res = read(pfd[0], &arg_str2, 1); //hang happens right here
break;
default:
/*parent case-- fall through*/
break;
}
pfd 是使用 pipe() 创建的。 arg_str 是一个非空的 char * 字符串,arg_str_size 是一个等于 arg_str 大小的 int。我添加了 read() 调用作为调试语句,以确保我的数据已成功写入管道。但是,当我调用它时,调用会无限期挂起。有人可以帮我解释一下我在这里做错了什么吗?
【问题讨论】:
-
如果这是一种人们可以玩的形式,那将是一个更好的问题。理想情况下可以按原样编译。
-
如果你想读写,你应该做两个管道。尝试将
read()值转换为指针绝对不会达到您希望的效果。您需要分配一些内存并读入,而不是读入指针。 -
@Paul:
pipe(2)制作单个 单向 管道。你可以从一端写到另一端,但另一端不能写回第一端。如果你想要一个双向管道,你需要两个管道(每个管道都有自己的读写端)。 -
@Paul:好的,我想我们在同一页上。目前尚不清楚 OP 到底打算在他的代码中做什么,因为从子进程读取和写入管道是一件不寻常的事情,而且很少是正确的事情。