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

时间:2014-01-23 22:08:46

标签: c linux

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

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()时,它每次都返回错误“invalid argument”。

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

2 个答案:

答案 0 :(得分:7)

本声明中的操作顺序是不可靠的:

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) {
                                                   ^^^

答案 1 :(得分:1)

您也可以先声明fd,然后将其与0进行比较。

    int fd = shm_open(shm_name, O_RDWR | O_CREAT, MODE);
    if (fd < 0){
       perror("\nshm_open() in Caretaker failed");
    }

毕竟可以减少混乱。