【发布时间】:2012-03-06 22:26:50
【问题描述】:
我只想写入文件描述符的是输入字符串。但是,它也会写入 fprintf 中传递的错误消息。有人可以解释为什么它会这样吗?这个小程序显示了行为。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
int fd;
mode_t mode = S_IRUSR | S_IWUSR;
char *filename = "file.txt";
char *input = "hello world";
char output[20];
// create and close
if((fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, mode)) == -1)
{
fprintf(stderr, "Error.\n");
return -1;
}
close(fd);
// just open
if((fd = open(filename, O_RDWR, mode)) == -1)
{
fprintf(stderr, "Error.\n");
return -1;
}
if(write(fd, input, 200) == -1)
{
fprintf(stderr, "Error.\n");
return -1;
}
// move back to beginning
if(lseek(fd, 0, SEEK_SET) == -1)
{
return -1;
}
if(read(fd, &output, 200) == -1)
{
fprintf(stderr, "Error.\n");
return -1;
}
printf("%s\n", output);
return 0;
}
【问题讨论】:
-
您没有向我们展示足够多的程序来回答您的问题。请提供一个完整的例子。
-
“即使达到了”是什么意思?我似乎明白了文件的输出似乎正在发生的要点,即使您的诊断正在打印。我怀疑你认为正在发生的事情并没有真正发生,你只是在某种程度上让自己感到困惑。请注意,您的 open() 调用不会截断文件。您是否正在检查 open() 是否成功?也许您并没有真正打开文件,而文件描述符实际上很糟糕。但是当您查看文件时,您正在查看正确的文件并且数据就在那里。执行 ls -l 时文件上的时间戳是多少?
-
我只想写入文件描述符的是块中的内容。但是,当我在写入文件后打开文件时,它包含块中的消息和所有 fprintf 消息,例如无法写入。\n
-
你能发布一个小的可编译程序来重现这个吗?
-
我添加了一个显示行为的程序。
标签: c file unix stdio file-descriptor