我正在尝试调试我的代码中的问题。我有一个持续运行的进程 A,直到我要求它停止。
在 A 内部,我执行以下操作:
- 挂载分区/dev/sda1
open()
//创建一个空文件 Xwrite()
//向其中写入一些字节close()
//关闭文件processFile()
//执行一些操作remove()
//删除文件- 卸载/dev/sda1
请注意,我会在上面的每个操作之后测试它是否成功,然后再继续。
当我执行 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;
请注意,我什至尝试过打开、关闭和删除。但我仍然看到进程持有句柄。
最佳答案
问题出在这几行:
if ((0 > tarFileDesc) && (0 != close(tarFileDesc)))
return false;
这只会在tarFileDesc < 0
时关闭文件描述符。 .你的意思是如果tarFileDesc >= 0
然后关闭它,因为它是一个有效的文件描述符,因此请尝试将此代码更改为:
if ((0 > tarFileDesc) || (0 != close(tarFileDesc)))
return false;
如果文件描述符无效,则返回 false,否则如果无法关闭它,则返回 false。
关于c++ - Linux 中 C++ 代码留下的文件句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1680487/