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

标签 c++ c linux

我正在尝试调试我的代码中的问题。我有一个持续运行的进程 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/

相关文章:

c++ - 制作链表 C++ 深拷贝的函数

c++ - 在插入 vector C++之前验证用户输入

c++ - 如何在不复制的情况下使用 std::string?

c - 为什么C链表追加失败

c - Minifilter 驱动程序 - CMD 仍然可以删除文件

linux - Telnet : How to remove NULL (0x00) after every CR (0x0d) on send, using char mode (interactive mode)?

c++ - C++ 的 Eclipse 指标插件

c - 不使用第三方应用程序回溯到共享库

linux - 我如何在不同的 X11 session 中打开一个窗口?

linux - 什么时候用引号括起 shell 变量?