我尝试组织使用经典方案fork()/ pipe()处理的父子之间的阻塞传输, 但是我不明白为什么只有第一个read()in child阻塞,但所有后续读取都没有,除此之外它们在读取后返回的结果不是零!
例如:
父级,首先将文件名写入子级,而不是等待答案:
for (NSString* file in filenames) {
fprintf(pict_log, "send to conversion file %s\n", filename);
write(g_pfds[1], filename, 512);
memset(filename, ' ', 512);
read(g_pfds[0], filename, 512);
fprintf(pict_log, "completed for file: %s\n", filename);
}
小孩,相同但反之亦然。
while(!g_break_child)
{
memset(filename, ' ', 512);
int read_bytes = read(g_pfds[0], filename, 512);
// some processing...
write(g_pfds[1], filename, 512);
}
每次迭代后我都应该在孩子的read()上被阻止,但为什么不发生这种情况呢?
答案 0 :(得分:1)
现在我可以自己回答,问题是: 在我的情况下我需要双向传输,但是当我们通过pipe()函数打开几个描述符时,我们因此创建单向通道,如果是双向传输,我们需要调用pipe()两次来创建两个单向管道!