我正在试验共享内存并用 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/