【发布时间】:2010-08-10 20:09:01
【问题描述】:
我想实现一个多线程、非阻塞的文件打开。理想情况下,所需的解决方案是调用 open() 并让它立即返回,并在 open() 操作实际完成时执行诸如注册要调用的回调(或处理信号或条件变量)之类的操作.为此,我编写了一个小测试驱动程序,它创建多个并发线程并尝试打开同一个文件。我希望 openat() 的返回是一个无效的文件描述符,带有 errno == EAGAIN,但 open 调用似乎总是阻塞,直到 open 成功完成。
对于非阻塞 open() 是否有这种方法的实现?
提前致谢。
参考线程代码:
void* OpenHandler(void* args)
{
// Declarations removed
Dir = "/SomeDir";
if ((DirFd = open(Dir, O_RDONLY )) < 0) {
printf("********Error opening Directory*******\n");
return NULL;
}
do {
FileFd = openat(DirFd, &FileName[DirLen], O_RDONLY | O_NONBLOCK);
/* If open failed */
if (FileFd == -1) {
if (errno == EAGAIN)
printf("Open would block\n");
else {
printf("Open failed\n");
pthread_exit(NULL);
}
}
else
Opened = 1;
} while (!Opened);
pthread_exit(NULL);
}
【问题讨论】:
标签: file-io linux-kernel