posix semaphore fehler beim erzeugen



  • hallo leute,
    habe hier ein problem bei dem ich nicht weiterkomme.

    sem_t *mysem;
      //const char semname[] = "/tmp/mysem";      //fuer named semaphore
      //mysem = sem_open(semname, 1, 0644, 1);   //fuer named semaphore
      //intialisierung des semaphors, 0 für local und 1 fuer ein semaphor
      sem_init (mysem, 0, 1);
    

    der compiler wird mit -lpthread auch gefüttert.
    nun kommt er immer mit der fehlermeldung
    mysem is uninitialized in this function ??? 😮
    ist klar, aber für das ist ja die funktion da, damit die semaphore initialisiert wird.

    vielleicht hatte ihr ja schon mal dasselbe problem.
    Danke
    Luisi 🙂



  • Ich hätte da einen Segfault erwartet. Gemeint ist das so:

    sem_t mysem;
    int err;
    
    err = sem_init(&mysem, 0, 1);
    

    Einen uninitialisierten Zeiger da reinzustopfen, erzeugt auf jeden Fall undefiniertes Verhalten.



  • seldon schrieb:

    Ich hätte da einen Segfault erwartet. Gemeint ist das so:

    sem_t mysem;
    int err;
    
    err = sem_init(&mysem, 0, 1);
    

    Einen uninitialisierten Zeiger da reinzustopfen, erzeugt auf jeden Fall undefiniertes Verhalten.

    wie intialisiert man dann den mysem??
    😃
    oder kannst du mir eine gute referenz dazu schreiben?
    wo ich genau die umgangsweise mit den posix-semaphoren erlernen kann?
    habe da schon einige zeit danach gesucht, aber nur so allgemeiner code
    hilft mir in dem fall halt nicht.

    Lg



  • wie intialisiert man dann den mysem??
    😃

    okay, der allgemeine aufbau von sem_t ist folgender:
    typedef struct
    {
    struct _pthread_fastlock __sem_lock;
    int __sem_value;
    _pthread_descr __sem_waiting;
    } sem_t;

    ich habe gedacht sem_init übernimmt die Intialisierung von mysem?
    wo liegt der mein denkfehler?? 😕



  • Dein Denkfehler liegt darin, dass Du dem sem_init einen Zeiger auf die zu initialisierende Struktur geben musst, aber keinen uninitialisierten Zeiger.

    sem_t *mysem;
    sem_init (mysem, 0, 1);  // falsch, da der Zeiger mysem irgendwohin zeigt
    
    sem_t mysem;
    sem_init (&mysem, 0, 1); // korrekt, da der Zeiger &mysem auf die Struktur mysem zeigt, die initialisiert wird
    


  • ich bins schrieb:

    Dein Denkfehler liegt darin, dass Du dem sem_init einen Zeiger auf die zu initialisierende Struktur geben musst, aber keinen uninitialisierten Zeiger.

    sem_t *mysem;
    sem_init (mysem, 0, 1);  // falsch, da der Zeiger mysem irgendwohin zeigt
    
    sem_t mysem;
    sem_init (&mysem, 0, 1); // korrekt, da der Zeiger &mysem auf die Struktur mysem zeigt, die initialisiert wird
    

    super danke für die info. du hast mir sehr sehr geholfen. 👍 😃 👍
    danke luis


Anmelden zum Antworten