1

共有メモリを使用して、2つの親子プロセスによって印刷された文字を保存したいと思います。子プロセスは「a」、「b」、「c」、「d」を最初の4バイトに保存し、次に親プロセスは「A」、「B」、「C」、「D」を次の4バイトに保存しますバイト。しかし、それは機能しません。コードは以下のとおりです。

#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
*
4

1 に答える 1

0

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

交換

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

*(ptr + off_a) = i;

他のsprintfと同じように。

于 2012-04-21T15:45:27.067 に答える