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