检查 POSIX 共享内存对象大小

标签 c posix shared-memory

有什么方法可以检查 shm_open 返回的文件描述符是否由当前进程创建或更早存在?另外,这样做之后有什么办法可以检查它的大小吗?

这是我目前拥有的:

if ((fd = shm_open(SHARED_OBJ_NAME, O_RDWR|O_CREAT, 0777)) == -1)
    die(1, "Failed to open shared object");

fd_size = lseek(fd, 0, SEEK_END);

printf("Shared size: %ld\n", fd_size);

if (fd_size == -1 || fd_size < SHARED_OBJ_SIZE) {
    if (ftruncate(fd, 255) == -1)
        printf("ftruncate failed\n");
    fd_size = lseek(fd, 0, SEEK_END);
}

printf("Shared size: %ld\n", fd_size);

但问题是我总是得到两次“Shared size: -1”,并且 ftruncate 不会仅在对象创建后立即调用时失败。

最佳答案

您可能希望在共享内存的名称上使用 stat() 并传入 struct stat 实例的地址。 .如果函数成功,您会在结构成员 st_size 中找到共享内存的大小。

来自POSIX documentation on stat() :

If the named file is a shared memory object, the implementation shall update in the stat structure pointed to by the buf argument the st_uid, st_gid, st_size, and st_mode fields, [...]


同时在共享内存描述符上调用 lseek() 会导致未指定的行为,因此它可能会产生预期结果,也可能不会产生预期结果,具体取决于运行代码的平台。为了保持代码的可移植性,请不要这样做。

来自POSIX documentation on lseek() :

If fildes refers to a shared memory object, the result of the lseek() function is unspecified.

关于检查 POSIX 共享内存对象大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32795449/

相关文章:

在共享内存 c 中创建 char 的二维数组

c++ - 特定共享内存写入操作 (MPI) 的同步

c++ - inet_aton() 对无效 IP 地址返回成功?

c++ - 可移植打印和比较 pthread_t

c - Linux内核 - 从其他模块调用函数时的上下文切换?

python - concurrent.futures 和 POSIX Linux 中异步 I/O 的区别

c - 使用具有固定宽度整数类型变量的 printf 宽度说明符

c - 测试共享内存,发生奇怪的事情

c++ - ffmpeg 调用 avcodec_send_packet 失败

c - 为什么 `fgets()` 需要一个 *str 而 `getline()` 需要一个 **str 参数?