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

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/

10-09 09:01