简而言之,如何在系统调用中对错误条件(如EINTR )进行单元测试。
我正在处理的一个特别的例子,它本身可能是一个例子,就是当fclose用(errno==EINTR)返回EOF时,是否有必要再次调用它。行为取决于fclose的实现:
// Given an open FILE *fp
while (fclose(fp)==EOF && errno==EINTR) {
errno = 0;
}如果发生EINTR时释放fp,则此调用可能不安全。我如何测试错误处理的时间(errno==EINTR)?
发布于 2008-10-07 00:27:08
在这种情况下,再次调用fclose()是不安全的,因为C标准规定,即使调用失败,流也会与文件分离(并变得不确定)。
发布于 2008-10-07 00:21:03
使用函数指针的结构来抽象系统函数。将对flcose(fp)的调用替换为sys->fclose(fp)。在您的单元测试中,创建一个总是返回EINTR的fclose实现,然后将sys->fclose设置为该版本。
发布于 2008-10-07 00:38:04
查看linux内核源代码,我找不到任何在文件关闭时返回EINTR的驱动程序。
如果你必须重现这种情况,你可以在Linux中编写自己的驱动程序,在.release方法上返回-EINTR。看看O‘’Reilly的Linux设备驱动程序一书中的example code。scull项目是最简单的项目之一。您可以将其更改为如下形式:
int scull_release(struct inode *inode, struct file *filp)
{
return -EINTR;
}不过,再一次浏览linux源代码树,我找不到任何在关闭时返回EINTR的驱动程序。
编辑- ok它看起来像fuse -用户空间文件系统也许能够。它用于像sshfs这样的东西。不过,这仍然是一种边缘情况。
https://stackoverflow.com/questions/176512
复制相似问题