C语言 父进程和子进程共享一个 IPC 共享内存



我想使用共享内存来保存两个父子进程打印的字符。 子进程将"A"、"B"、"C"、"D"保存到前四个字节中,然后父进程将"A"、"B"、"C"、"D"保存到接下来的四个字节中。但它不会起作用。代码如下:

#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 memoryn");exit(-1);
        }
        if ((ptr = shmat(shmid, NULL, 0)) == (void *)-1) {
                printf("cannot attach shared memory to addressn");
                exit(-1);
        }
        if ((pid = fork()) < 0) {
                printf("fork errorn");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     b   c   d                
0000020                                
*

冲刺 添加尾随 NULL;

取代

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

*(ptr + off_a) = i;

与其他冲刺类似。

最新更新