2014-09-09 4 views
0

Я пытаюсь открыть общий файл mem и записать в него. Проблема в том, что ftruncate возвращает -1.Ошибка общей памяти Linux Linux - ftruncate

Вот мой код:

#include <stdio.h> 
#include <string.h> 
#include <limits.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include<sys/mman.h> 
#include<sys/stat.h> 
#include <fcntl.h> 

int main(void) { 


    int fd; 
    fd=shm_open("/shmem-m", O_CREAT,0777); 
    printf("%d\n",fd); 
    int a=ftruncate(fd, 1024); 
    printf("%d\n",a); 
    void* addr=mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED,fd, 0); 
    char* msg= "hola mundo!"; 
    memcpy(addr,msg,strlen(msg)); 
    exit(EXIT_SUCCESS); 
    //return 0; 


} 

Выход:

3 
-1 
Segmentation fault 

Любые идеи? Большое спасибо

+0

Когда системные вызовы, такие как ['ftruncate'] (http://man7.org/linux/man-pages/man2/ftruncate.2.html), возвращают' -1', это означает, что есть ошибка, вы должны проверить ['errno'] (http://man7.org/linux/man-pages/man3/errno.3.html), чтобы узнать, что случилось. Вы можете использовать, например. ['perror'] (http://man7.org/linux/man-pages/man3/perror.3.html), чтобы напечатать сообщение об ошибке. –

+0

Я думаю, что это дубликат [этого] [1]. [1]: http://stackoverflow.com/questions/21320359/shm-open-and-ftruncate-in-shared-memory-programming –

+2

Попробуйте 'shm_open ("/ SHMEM-М", O_CREAT | O_RDWR, 0777). Файл должен быть открыт в режиме записи, чтобы использовать 'ftruncate'. – foobar

ответ

2

Проблема заключается в том, что POSIX требует, чтобы файл был открыт в режиме записи для вызова ftruncate для достижения успеха, как указано в ftruncate man page.

Таким образом, звонок в shm_open будет shm_open("/shmem-m", O_CREAT | O_RDWR, 0777), с установленным флагом O_RDWR (shm_open man page).

Смежные вопросы