2012-12-17 41 views
0

我正在嘗試使用數據將文件寫入我的共享內存段。然而,我所嘗試的一切似乎只是爲了給錯誤分段錯誤。我一直在搜索互聯網尋求更多的一天的幫助。無法將數據添加到共享內存中

int main(int argc, char *argv[]). 
{ 
    int sm; 
    char *data; 
    int pid=atoi(argv[1]); 
    int key=atoi(argv[2]); 
    char (*d)[1025]; 
    data=(char*) malloc(1025); 


    //put the data in the shared memory segment 
    FILE *file=fopen(argv[3], "r"); //r for read 
    if (file==0) 
    {printf("Could not open file");} 
    else 
    { 
     while(fgets(data, 1025, file)!=NULL) 
     { 
      fputs(data, file); 
     // puts(d); 
     }  
     fclose(file); 
    } 

    //access shared memory 
    //S_IWUSR gives owner the write permession 
    sm = shmget(key, 1024, S_IWUSR); 
    //create a pointer to the shared memory segment 
    d = shmat(sm, (void *)0, 0); //shared memory id, shmaddr, shmflg 
    //for (int j=0; j<100; j++) 
     strcpy(d[0], data); 

    shmdt(d); //detach the shared memory segment 
    //remove the shared memory segment 
    shmctl(sm, IPC_RMID, NULL); 
} 

任何幫助將不勝感激 預先感謝

編輯:添加的malloc

EDIT2:也許我應該改一下我的問題,我的問題是數據進入我的共享內存

+1

你有沒有打過它?哪條線完全失敗? – giorashc

+0

我認爲這是strcpy行失敗,至少我嘗試將數據添加到共享內存失敗 – gudnylara7

+0

你有沒有注意到char(* d)[1025]是一個指向1025個字符數組的指針你的意思是char d [1025]這是一個已經分配的1025個字符的數組)。作爲@benjarobin提到你的數據沒有分配 – giorashc

回答

0

+1約rjayavrp答案

,我還可以補充一點,數據不分配......這只是一個指針,而不是字符的陣列..

而且你有什麼想做

char (*d)[1025]; 

一個快速和骯髒的例子:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 

#define SIZE_SHARED_MEMORY 1024 

int main(int argc, char *argv[]) 
{ 
    int sm = -1; 
    char *d = NULL; 
    FILE *file = NULL; 
    key_t key = 0; 
    int ret = 0; 

    if (argc != 4) 
    { 
     return 1; 
    } 

    key = atoi(argv[2]); 

    //access shared memory 
    sm = shmget(key, SIZE_SHARED_MEMORY, IPC_CREAT | 0600); 
    if (sm == -1) 
    { 
     perror("shmget : Failed"); 
     return 2; 
    } 

    //create a pointer to the shared memory segment 
    d = shmat(sm, (char *)0, 0); 
    if (d == (void *)-1) 
    { 
     perror("shmat : Failed"); 
     return 3; 
    } 

    // Open the file 
    file = fopen(argv[3], "r"); 
    if (file == NULL) 
    { 
     perror("fopen : Failed"); 
     ret = 4; 
    } 
    else 
    { 
     if(fgets(d, SIZE_SHARED_MEMORY, file) == NULL) 
     { 
      perror("fgets : Failed"); 
      ret = 5; 
     } 
     fclose(file); 
    } 

    shmdt(d); //detach the shared memory segment 

    // remove the shared memory segment ??? 
    // Don't understand why you are doing this 
    shmctl(sm, IPC_RMID, NULL); 

    return ret; 
} 
+0

我的共享內存應該保存1024個字母,所以我認爲我的數據也可以有1024個字母。就像我說的我已經嘗試了很多方法來讓我的數據進入共享內存而不幸運 – gudnylara7

+0

添加示例,測試:它編譯並運行 – benjarobin

+0

謝謝!但是,如何檢查數據是否在內存段中? – gudnylara7

0
  1. 僅在讀取模式下打開文件。

將其更改爲rw+這將以讀/寫模式打開文件。如果文件不可用,它將被創建。

fputs(data, file);這裏文件以只讀模式打開,但寫入正在發生。

但我不知道,爲什麼你試圖將讀取的數據寫入相同的文件。你應該首先考慮你的設計。

2. char(* d)[1025];是一個指向大小爲1025的char數組的指針。你在strcpy()中使用它。

3.內存應分配爲data靜態或動態。

+0

我試圖從argv [3]添加到我的共享內存中的文件,並認爲這將是很好的使用fputs。還有什麼更好的方法? – gudnylara7

+0

'while(fgets(data,1025,file)!= NULL)'的問題。數據的Bcos內存不會像@benjarobin所述的那樣分配。 – Jeyaram

+0

但是有可能把這個以某種方式放在共享內存中嗎?如果我只是使用puts(data),那麼我的數據會被打印出來,所以我認爲它的工作 – gudnylara7