我有一个非常奇怪的错误。如果我这样做:
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的方式有关。
知道发生了什么事吗?
答案 0 :(得分:0)
可能问题在于缓冲区。
问题是特殊文件,例如/proc
的特殊文件,是......,特别的,它们并不总是简单的字节流,必须用特定的文件写入(或读取)尺寸和/或抵消。你没有说你要写什么文件,所以无法确定。
然后,对fwrite()
的调用假定输出fd是一个简单的字节流,因此它可以进行智能化的事情,例如缓冲和拼接以及复制给定的数据。在常规文件中,它只会起作用,但在特殊文件中,可能会发生有趣的事情。
为了确定,尝试使用两个版本的程序运行strace
并比较输出。如果您愿意,可以发布以获取更多评论。