gpt4 book ai didi

c - 共享内存编程中的 shm_open 和 ftruncate()

转载 作者:IT王子 更新时间:2023-10-29 01:01:00 34 4
gpt4 key购买 nike

我想创建一个共享内存对象并将其截断为特定大小。

SHMSIZE定义为512

MODE 设置为 S_IRUSR | S_IWUSR | S_IWGRP | S_IRGRP | S_IWOTH | S_IROTH

这是我的代码

char *shm_name = "SharedMemory";    
int fd;

/* Open an Shared Memory Object for Read-/Write-Access */
if((fd = shm_open(shm_name, O_RDWR | O_CREAT, MODE) < 0)) {
perror("\nshm_open() in Caretaker failed");
exit(EXIT_FAILURE);
}

/* Truncate Shared Memory Object to specific size */
if((ftruncate(fd, SHMSIZE) < 0)) {
perror("\nftruncate() in Caretaker failed");
exit(EXIT_FAILURE);
}

在调试时,我观察到 shm_open() 的返回值每次都是 0,但我可以在/dev/shm 中看到这个对象。在执行 ftruncate() 时,它每次都会返回错误“无效参数”。

为什么 fd 每次都是 0,为什么 ftruncate 不起作用?我该怎么办?

最佳答案

这个语句中的操作顺序是不稳定的:

if((fd = shm_open(shm_name, O_RDWR | O_CREAT, MODE) < 0)) {

您正在分配 shm_open(...) < 0 的结果至 fd ,这绝对不是您想要的。

将比较移到括号外:

if((fd = shm_open(shm_name, O_RDWR | O_CREAT, MODE)) < 0) {
^^^

关于c - 共享内存编程中的 shm_open 和 ftruncate(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21320359/

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