在Linux中由C ++代码留下的文件句柄

我想在我的代码中debugging一个问题。 我有一个连续运行的进程,直到我要求它停止。

在AI内部执行以下操作:

  • 装载分区/ dev / sda1
  • open() //创build一个空文件X.
  • write()写一些字节
  • close() //closures文件
  • processFile() //执行一些操作
  • remove() //删除文件
  • umount / dev / sda1

注意如果成功或者不能前进,我会在上面的每个操作之后进行testing。 当我做lsof | grep A lsof | grep A它显示了进程A拥有的X的文件句柄。我也看到它有一个(删除)。 这可以防止我卸下分区。 为什么会发生这种情况,我怎样才能解决这个问题?

编辑 :谢谢大家。 以下是代码片段:

 tarFileDesc = _pSysCall->open("test.tar", O_CREAT | O_RDWR | O_APPEND, 0777); if (0 > tarFileDesc) return false; ... some logging here // Write http stream to tar file, istr is an argument to my function int read_buffer_size = 0; buffer = new char[4096]; while (!istr.eof() && count < content_length) { if ((content_length - count) >= 4096) read_buffer_size = 4096; else read_buffer_size = content_length - count; memset(buffer, 0, 4096); istr.read(buffer, read_buffer_size); std::streamsize in_bytes = istr.gcount(); if (istr.fail() || istr.bad()) { status = false; break; } if (write(tarFileDesc, buffer, in_bytes) != in_bytes) { status = false; break; } count += in_bytes; } // Cleanup buffer delete[] buffer; if ((0 > tarFileDesc) && (0 != close(tarFileDesc))) return false; if (0 != system("tar C /test -xvf test.tar")) return false; if (0 != remove("test.tar")) return false; 

注意我甚至尝试只是打开,closures和删除。 但我仍然看到处理被处理。

问题在于这些方面:

 if ((0 > tarFileDesc) && (0 != close(tarFileDesc))) return false; 

如果tarFileDesc < 0这将只关闭文件描述符。 你的意思是如果tarFileDesc >= 0然后关闭它,因为它是一个有效的文件描述符,所以请尝试更改此代码:

 if ((0 > tarFileDesc) || (0 != close(tarFileDesc))) return false; 

这样,如果文件描述符无效,则返回false,否则,如果无法关闭它,则返回false。

谢谢大家。 以下是代码片段:

 tarFileDesc = _pSysCall->open("test.tar", O_CREAT | O_RDWR | O_APPEND, 0777); if (0 > tarFileDesc) return false; ... some logging here // Write http stream to tar file, istr is an argument to my function int read_buffer_size = 0; buffer = new char[4096]; while (!istr.eof() && count < content_length) { if ((content_length - count) >= 4096) read_buffer_size = 4096; else read_buffer_size = content_length - count; memset(buffer, 0, 4096); istr.read(buffer, read_buffer_size); std::streamsize in_bytes = istr.gcount(); if (istr.fail() || istr.bad()) { status = false; break; } if (write(tarFileDesc, buffer, in_bytes) != in_bytes) { status = false; break; } count += in_bytes; } // Cleanup buffer delete[] buffer; if ((0 > tarFileDesc) && (0 != close(tarFileDesc))) return false; if (0 != system("tar C /test -xvf test.tar")) return false; if (0 != remove("test.tar")) return false; 

注意我甚至尝试只是打开,关闭和删除。 但我仍然看到处理被处理。

你可能不得不张贴一些代码。 但是这对你来说是一个很好的窍门 – 如果你在Unix / Linux / Mac OS X中创建一个临时文件,你可以立即删除它,你仍然可以写入,读取等等,但是一旦你关闭它,走开。 如果在程序关闭之前某个错误会杀死您的程序,它也会消失。

这看起来可疑:

 if ((0 > tarFileDesc) && (0 != close(tarFileDesc))) return false; 

展望你的代码的顶部,你已经做了0 > tarFileDesc检查,如果真的返回false在这一点。 所以我在考虑这部分检查是多余的? 即,这应该简单地读:

 if (0 != close(tarFileDesc))) return false;