2012-04-21 19 views
1

2つの親子プロセスで印刷された文字を共有メモリに保存したい。子プロセスは最初の4バイトに 'a'、 'b'、 'c'、 'd'を保存し、次に親4は 'A'、 'B'、 'C​​'、 'D'バイト。しかし、それはコードは以下の通りですwork.theません。私はそれをデバッグするためにGDBを使用し、親プロセスと子プロセスがIPC共有メモリを共有する

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

int 
main(int argc, char **argv) { 
     int shmid,i,j,off_a,off_b; 
     char *ptr; 
     pid_t pid; 

     shmid = shmget(IPC_PRIVATE, 200, SHM_W | SHM_R | IPC_CREAT); 
     if (shmid < 0) { 
       printf("cannot create shared memory\n");exit(-1); 
     } 
     if ((ptr = shmat(shmid, NULL, 0)) == (void *)-1) { 
       printf("cannot attach shared memory to address\n"); 
       exit(-1); 
     } 

     if ((pid = fork()) < 0) { 
       printf("fork error\n");exit(-1); 
     } else if (pid) { 

       wait(); 

       for (i = 'A', off_a = 0; i <= 'D'; i++ ,off_a += 1) 
         sprintf(ptr + off_a,"%c",i); 

       printf("RESULT:%s \n", ptr); 

     } else { 
       for (j = 'a', off_b = 4; j <= 'd'; j++, off_b += 1) 
         sprintf(ptr + off_b,"%c",j); 

       exit(0); 

     } 
} 

が、私は結果がたとえばABCDABCDだと思いますが、私はそれを実行したとき、それはABCDを印刷し、ファイルに書き込み、 'a'文字は失われます。なぜこれが起こったのですか?

0000000 A B C D \0 b c d \0 \0 \0 \0 \0 \0 \0 \0 
0000020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 
* 
+0

理由は、cの文字列にアクセスするときに、文字列が最後のNULL(\ 0)で区切られているため、関数が文字列の終わりを知ることができるからです。ありがとう。 – byrondrossos

答えて

0

sprintfは末尾のNULLを追加します。

他のsprintfと

*(ptr + off_a) = i; 

と同様で

sprintf(ptr + off_a,"%c",i); 

を交換します。

+0

ありがとう。それは問題です。 –

関連する問題