众所周知,read
和write
的系统调用可以使用的字节数少于请求的字节数。但这是相对罕见的,并且通常无法很好地测试。考虑这个越野车C程序:
#include <unistd.h>
int main(void) {
const char *buf = "Hello, World!\n";
size_t count = 14;
do {
ssize_t written = write(STDOUT_FILENO, buf, count);
if(written < 0) return 1;
/* whoops, forgot to do `buf += written;`! */
count -= written;
} while(count);
return 0;
}
由于它忘记调整buf
,因此如果第一个write
只写7个字符,它将最终打印Hello, Hello,
而不是Hello, World!
。但是,在正常测试中您几乎不可能捕获到该错误,因为它实际上总是在一个调用中写入所有14个字符。我有什么方法可以在测试期间允许的任何时候对read
和write
进行悲观的分析以进行部分写入,从而可以更容易地发现这些错误?一些必备功能:
/proc/self/uid_map
,inotify,eventfd或需要(并保证能够)在一个系统调用中读取或写入多个字节的其他特殊FD的程序