c++ - 如果我删除其他进程的共享内存会怎样?

标签 c++ c linux operating-system

我正在试验共享内存并用 C 编写多处理程序。我正在使用 ipcrm 命令删除共享内存,但我不小心删除了不是由我或我的程序分配的共享内存。除了它的 key 变成 0x00000000 之外什么也没有发生。我想知道这样做是否危险,因为它可能对其他进程至关重要。

另一方面,存储关键数据的最佳方式是什么,这样像我这样的新手就不会崩溃进程?

最佳答案

在当前的 POSIX 标准中,共享内存只是每个进程的一个文件。让我们看看设置共享内存的接口(interface) shm_open():

/* shm_open - open a shared memory file */
int shm_open (const char *name, int oflag, mode_t mode)
{
  int fd;
  char shm_name[PATH_MAX+20] = "/dev/shm/";

  /* skip opening slash */
  if (*name == '/')
    ++name;

  /* create special shared memory file name and leave enough space to
    cause a path/name error if name is too long */
  strlcpy (shm_name + 9, name, PATH_MAX + 10);

  fd = open (shm_name, oflag, mode);

  if (fd != -1)
    {
      /* once open we must add FD_CLOEXEC flag to file descriptor */
      int flags = fcntl (fd, F_GETFD, 0);

      if (flags >= 0)
        {
          flags |= FD_CLOEXEC;
          flags = fcntl (fd, F_SETFD, flags);
        }

      /* on failure, just close file and give up */
      if (flags == -1)
        {
          close (fd);
          fd = -1;
        }
    }

  return fd;
}

我们可以看到shm_open()只是创建了一个关于共享内存信息的文件。当一个进程删除自己打开的共享内存时,不会影响其他使用共享内存的进程。这也意味着,进程对共享内存的访问不是同步的。

对于第二个问题,只有root和进程的所有者可以使用ipcrm删除进程的共享内存文件,所以这可能是一个安全的操作。

关于c++ - 如果我删除其他进程的共享内存会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34145728/

相关文章:

c++ - 大小为 10 的 vector 的测试用例失败

c - 如何使用 UDP 广播消息知道远程主机的 IP 地址?

linux - 使用 RestXQ 服务打开的文件过多

c - 如何在 C/C++ 中使用自动更正、自动完成、拼写检查功能实现字典

c - Sqlite3如何识别表锁定状态然后插入

c++ - 搜索继承另一个类的 C++ 类

sql - oracle 行计数到 shell 脚本变量

c++ - R 值似乎无法为未命名的临时对象提供不完整的支持,或者我在这里遗漏了什么?

c++ - 使用 Opencv 分布良好的特征

c++ - 使用 pkg-config 输出将库链接到 QT 项目