C: Shared Memory in char array casten

DerHandwerk

Grünschnabel
Hallo allerseits,

ich habe bei folgendem Konstrukt ein Problem:

Ich hab mir ein stück Shared Memory auf folgende Weise reserviert
Code:
#define BAR_SIZE 7
...
memID = shmget(MEM_KEY, sizeof(char[BAR_SIZE][256]), IPC_EXCL|IPC_CREAT|RIGHTS);
...
und möchte den Speicher nur in mein Programm einhängen
Code:
char *bar[BAR_SIZE][256]; // sollf auf des Shared Memory zeigen
...
bar = (char **) shmat(memID, NULL, 0);

Leider erzeugt dies einen Compiler-Error ("Incompatible types in assignment"). Meine Frage: Wie muss ich die Rückgabe aus shmat() korrekt casten damit sie mit dem bar-Pointer kompatibel wird.

Schon mal vielen Dank im Vorraus!

Gruß DerHandwerk
 
Zuletzt bearbeitet:
So,

ich bin jetzt mittlerweile selber drauf gekommen, dass der Pointer auf das Shared Memory so aussehen muss:

Code:
char (*bar)[BAR_SIZE][256];
Jedoch enden nun Zusweisungen wie
Code:
(*bar)[0] = "test";
in einem Compilerfehler: "incomaptible types in assignment"

?
 
Hallo,

wieso muss denn bar bei dir so deklariert werden? Wenn du ein einfaches String-Array als shared memory Bereich anlegen willst tut es auch ein char ** anstatt eines char***.

Desweiteren stört es mich das du die Spalten deines Arrays schon vor allozierst, wobei diese doch dann eh mit einem String aus dem Textsegment ( "test") wieder überschrieben werden?

Die einfache Frage auf deine Antwort ist

C:
char *bar[BAR_SIZE][256]; // sollf auf des Shared Memory zeigen
...
bar = (char ***) shmat(memID, NULL, 0);

Wenn man allerdings meine obigen Fragen berücksichtigst solltest du dir nochmal Gedanken über die Deklaration von bar machen.


Ein einfaches Bsp. zum Umgang mit shared memory angewendet auf ein 2-dimensionales char Array:
C:
#include <unistd.h>
#include <stdio.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/types.h>

#define SHM_KEY 0xDEADAFFE
#define NUMBER_OF_STRINGS 10

char **shared_strings = NULL;


int main()
{
    int shmid = -1, procid = -1, i;

    if ((shmid = shmget(SHM_KEY,
                        NUMBER_OF_STRINGS * sizeof(char*),
                        IPC_EXCL | IPC_CREAT | 0700)) < 0) {
        perror("Error in shmget()");
        return 1;
    }
  
    /* attach the shared segment into process's address space */
    if ((shared_strings = shmat(shmid, shared_strings, 0)) == (void *) -1) {
        perror("Error in shmat()");
        return 1;
    }

    /* create a child process, after fork the shared segment
     * will be inherited into the child process */
    if ((procid = fork()) == -1) {
        perror("Error in fork()");
        return 1;
    }

    if (procid != 0) {
        /* wait for the child process to finish */
        wait(NULL);
        /* print the message */
        for (i = 0; i < NUMBER_OF_STRINGS; i++)
            printf("%s\n", shared_strings[i]);

        /* detach the shared segment from this process's address space */
        if (shmdt(shared_strings) == -1) {
            perror("Error in shmdt()");
            return 1;
        }

        /* delete the shared segment as soon as the last shmdt was called */
        if (shmctl(shmid, IPC_RMID, NULL) == -1) {
            perror("Error in shmctl()");
            return 1;
        }
    } else {
        /* send a message to the father */
        for (i = 0; i < NUMBER_OF_STRINGS; i++)
            shared_strings[i] = "Hello father, i will RIP when you read this message!";
    }

    return 0;
}

HTH,
RedWing
 
Zuletzt bearbeitet:
Zurück