gpt4 book ai didi

c++ - Linux 中 C++ 代码留下的文件句柄

转载 作者:太空狗 更新时间:2023-10-29 11:34:55 25 4
gpt4 key购买 nike

我正在尝试调试我的代码中的问题。我有一个持续运行的进程 A,直到我要求它停止。

在 A 内部,我执行以下操作:

  • 挂载分区/dev/sda1
  • open()//创建一个空文件 X
  • write()//向其中写入一些字节
  • 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com