두 부모 - 자식 프로세스가 인쇄 한 문자를 공유 메모리에 저장하려고합니다. 자식 프로세스는 첫 번째 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
*
이유는 c에서 문자열에 액세스 할 때 문자열 문자가 마지막 NULL (\ 0)으로 구분되어 함수에서 문자열의 끝 부분을 알 수 있기 때문입니다. 덕분에 – byrondrossos