2017-09-11 3 views
-1

このコードの目的は、共有メモリ空間を作成し、その子にnの値を書き込み、次に親プロセスから生成されたすべての数値を出力することです。しかし、これは現在、私がプログラムを実行するたびに変わる16481443B4のようなメモリアドレスを表示しているだけです。共有メモリへの書き込みが間違っているのか、共有メモリからの読み込みが正しくないのか分かりません。おそらく両方。共有メモリ空間への書き込みと読み出しの問題c

#include <sys/types.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <wait.h> 
#include <fcntl.h> 
#include <sys/stat.h> 
#include <sys/shm.h> 
#include <sys/mman.h> 

int main(int argc, char** argv){ 

    //shared memory file descriptor 
    int shm_fd; 

    //pointer to shared memory obj 
    void *ptr; 
    //name of shared obj space 
    const char* name = "COLLATZ"; 

    //size of the space 
    const int SIZE = 4096; 

    //create a shared memory obj 
    shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); 

    //config size 
    ftruncate(shm_fd, SIZE); 

    //memory map the shared memory obj 
    ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0); 

    int n = atoi(argv[1]); 
    pid_t id = fork(); 

    if(id == 0) { 
     while(n>1) { 
      sprintf(ptr, "%d",n); 
      ptr += sizeof(n); 
      if (n % 2 == 0) { 
       n = n/2; 
      } else { 
       n = 3 * n + 1; 
      } 
     } 
     sprintf(ptr,"%d",n); 
     ptr += sizeof(n); 
    } else { 
     wait(NULL); 
     printf("%d\n",(int*)ptr); 
    } 

    //Umap the obj 
    munmap(ptr, SIZE); 

    //close shared memory space 
    close(shm_fd); 

    return 0; 
} 
+0

あなたはエラーをチェックしますか? – spectras

+0

エラーチェックコードはありません入力は常に正しいと思います –

+1

誰が言っていますか?使用している通話はすべて失敗する可能性があります。 'shm_open'は' -1'を返します。だから 'ftruncate'するかもしれません。 'mmap'は' MAP_FAILED'を返します。 'fork'も' -1'を返すことができます。あなたは**エラー条件をチェックし、それらに対処する必要があります(例えば、 '' perror' '(https://linux.die.net/man/3/perror)でエラーコードを '終了します)。 – spectras

答えて

1

あなたのコンパイラを聞きなさい!あなたが整数を印刷したいと仮定すると、

$ gcc main.c -lrt 
main.c: In function 'main': 
main.c:51:9: warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat=] 
    printf("%d\n",(int*)ptr); 
     ^

ptrによって指さ、それは次のようになります。どの時点で

printf("%d\n",*((int*)ptr)); 
+0

これは始まりですが、投稿されたサンプルには非常に多くのものがあります。 voidポインター演算?不正なシステムコール引数?エラーチェックの欠如?文字列表現の誤解?コードを実行しようとせずにすばやく見るだけです。 – spectras

+0

@spectrasはい、コードには間違ったことがたくさんありますが、これは生のポインタ値を出力するという直ちの問題を解決します。 – Tim

関連する問題