【问题标题】:How close pipe handle in unix? (fclose() of pclose())?在 unix 中如何关闭管道处理? (pclose()的fclose())?
【发布时间】:2011-04-05 07:04:47
【问题描述】:
如果我以这种方式在 unix 中创建管道:
int fds[] = {0, 0};
pipe(fds);
然后将FILE *从fds[0]变成这样:
FILE *pipe_read = fdopen(fds[0], "rt");
那我应该如何关闭这个文件(pipe_read)?
fclose(pipe_read)
pclose(pipe_read)
close(fileno(pipe_read))
【问题讨论】:
标签:
c++
unix
file
posix
pipe
【解决方案1】:
fdopen 返回一个FILE* 所以你应该fclose 它。这也将关闭底层文件描述符。
pclose 调用用于关闭使用popen 创建的句柄,该函数用于运行命令并通过管道连接到它。
close 调用将关闭底层文件描述符,但不幸的是,在文件句柄有机会刷新其数据之前 - 换句话说,您可能会丢失数据。
【解决方案2】:
你应该使用 fclose(pipe_read)。
close() 关闭内核中的文件描述符。这还不够,因为文件指针不是空闲的。因此,您应该在 pipe_read 上使用 fclose(),它还将负责关闭文件描述符。