2012-04-21 2 views
1

두 부모 - 자식 프로세스가 인쇄 한 문자를 공유 메모리에 저장하려고합니다. 자식 프로세스는 첫 번째 4 바이트에 'a', 'b', 'c', 'd'를 저장 한 다음 상위 4 바이트를 'A', 'B', 'C', 'D' 바이트. 하지만이 코드는 다음과 같습니다 퍼지고하지 않을 것이다 : 나는 그것을 디버깅하기 위해 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을 추가합니다.

*(ptr + off_a) = i; 

와 유사하게 다른 sprintf와 함께

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

를 교체합니다.

+0

. 그래서 그것은 문제입니다. –

관련 문제