默认情况下,stdin、stdout、stderr文件描述符为0、1和2。但是,在我通过fd = open(foo, 0)打开一个文件之后,我发现fd现在是1.1,用于新的文件描述符。现在什么是stdout文件描述符?或者是关闭了我需要重新打开它?如果是,怎么做?是否有办法保持0,1,2文件描述符和使用从3?
/* readslow from the book with my "improve": the unix programming environment */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define SIZE 512
int main (int argc, char *argv[])
{
char buf[SIZE];
int n, fd;
int t = 10;
if ((argc > 1) && (fd = open(argv[1], 0) == -1)) {error("can't open %s", argv[1]);}
fprintf(stderr, "%d", fd);
for (;;) {
while ((n = read(fd, buf, sizeof buf)) > 0)
write(1, buf, n);
sleep(t);
}
}fprintf(stderr, "%d", fd)会给我1。
发布于 2019-12-05 04:53:04
您的代码包含以下片段:
if (argc > 1 && (fd = open(argv[1], 0) == -1))fd中的结果就像您在括号内写了比较一样:
if (argc > 1 && (fd = (open(argv[1], 0) == -1)))因此分配给fd的结果是正确的1,因为open()返回的值确实是-1。您应该在作业周围加上括号:
if (argc > 1 && (fd = open(argv[1], 0)) == -1)发布于 2019-12-05 04:24:41
当这个答案被合成的时候,问题中没有代码。我接受了OP的说法,即open返回的文件描述符是1__,但由于错误的paren,结果证明这是不正确的。
我发现
现在的
fd是1.1,用于新的文件描述符。
唯一的办法是,如果你关闭fd 1。
现在什么是stdout文件描述符?
fileno(stdout)将给出与句柄相关联的fd。
是否有一种方法来保持0,1,2文件描述符并使用从3?
如果您不关闭fd 0,1和2,它们将不会被重用。open使用编号最低的未使用的文件描述符.
如果您希望断开fd 0、1或2,请不要关闭它们。这会引起各种各样的问题。将它们重新打开到/dev/null。
还是关闭了我需要重新打开它?如果是,怎么做?
您可以使用dup2使fd成为另一个别名。
https://stackoverflow.com/questions/59188184
复制相似问题