父进程和子进程共享一个IPC共享内存
问题描述:
我想用共享内存来保存由两个父子进程打印的字符。子进程将'a','b','c','d'保存到前四个字节中,然后父进程将'A','B','C','D'保存到接下来的四个字节。但它不会work.the代码如下:父进程和子进程共享一个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,我用gdb调试它,并将其写入到文件中, '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
*
答
sprintf增加了一个尾随NULL;
更换
sprintf(ptr + off_a,"%c",i);
与
*(ptr + off_a) = i;
,同样与其他的sprintf。
+0
谢谢。所以这是问题。 – 2012-04-21 15:57:58
原因是,当你访问c中的一个字符串时,字符串由最终的NULL(\ 0)分隔,这样函数就能够判断字符串的结束位置。 – byrondrossos 2012-04-21 15:42:55