(打开+写入)与(fopen + fwrite)对内核/ proc /

时间:2014-12-20 19:50:35

标签: linux linux-kernel kernel fwrite

我有一个非常奇怪的错误。如果我这样做:

    int fd = open("/proc/...", O_WRONLY);
    write(fd, argv[1], strlen(argv[1]));
    close(fd);

一切都在工作,包括一个很长的字符串长度> 1024。

如果我这样做:

    FILE *fd = fopen("/proc/...", "wb");
    fwrite(argv[1], 1, strlen(argv[1]), fd);
    fclose(fd);

字符串大约需要1024个字符。

我正在运行带有3.4内核的ARM嵌入式设备。我已经在内核中调试了,当我到达早期的函数vfs_write时,我看到字符串已被切断(我发现这个函数带有WARN_ON指令来获取堆栈)。

问题与fputs和puts相同。

如果我写入标准的rootfs文件,我可以使用fwrite作为一个很长的字符串(> 1024)。所以问题实际上与内核处理/ proc的方式有关。

知道发生了什么事吗?

1 个答案:

答案 0 :(得分:0)

可能问题在于缓冲区。

问题是特殊文件,例如/proc的特殊文件,是......,特别的,它们并不总是简单的字节流,必须用特定的文件写入(或读取)尺寸和/或抵消。你没有说你要写什么文件,所以无法确定。

然后,对fwrite()的调用假定输出fd是一个简单的字节流,因此它可以进行智能化的事情,例如缓冲和拼接以及复制给定的数据。在常规文件中,它只会起作用,但在特殊文件中,可能会发生有趣的事情。

为了确定,尝试使用两个版本的程序运行strace并比较输出。如果您愿意,可以发布以获取更多评论。