sem_open - Problem mit Semaphoren

Peregrine

Peregrine

Honorarkonsul
Hallo liebe Community,

neuerdings habe ich nach einiger Zeit Hochsprache wieder mehr mit C zu tun. Hierzu gleich eine Frage. Folgender Code ist unter dem Betriebssystem VXWorks entstanden (Echtzeit OS auf Unixbasis). Eine Portierung sollte kein Problem darstellen, da nur Posix- und OpenSource-Bordmittel verwendet werden; hier hat sich aber unter Mac (GCC 4.2) ein Problem angemeldet.

Und zwar wird beim Aufruf sem_t * sem_open(const char *name, int oflag, ...); (konkret bei der Semaphore carpark) der Wert EACCES ausgegeben. Ändert man die Berechtigungsparameter im Aufruf beispielsweise auf 07777 ab, entfällt der Fehler, der sem_wait() Aufruf wird aber vollkommen ignoriert und die Semaphore wird übergangen, als stünde sie nicht im Code. Es gibt aber weder Übersetzungs- noch Laufzeitfehler.
Hat jemand ein ähnliches Problem schon einmal gehabt oder steh' ich hier einfach nur auf dem Schlauch?!
Jede Art von Hilfe ist sehr (!) willkommen.

Viele Grüße,
Marcus

P.S. Habt ihr vielleicht eine Möglichkeit/ Tip für mich, wie ich mit Semaphoren beim Debuggen umgehen könnte? Sprich wir stelle ich fest, dass die Werte auch wie gewünscht inkrementiert und dekrementiert werden?!

Code:
#include <pthread.h>
#include <stdio.h>
#include <semaphore.h>
#include <time.h>
#include <errno.h>

#define waitForCarEntrance()	{sem_wait(carpark_entrance);}
#define waitForCarExit()	{sem_wait(carpark_exit);}
#define enter_carpark()	{sem_post(carpark_entrance); sem_wait(carpark_entrance_gate);}
#define leave_carpark()	{sem_post(carpark_exit); sem_wait(carpark_exit_gate);}
#define openBarrierEntrance() sem_post(carpark_entrance_gate)
#define openBarrierExit() sem_post(carpark_exit_gate)

#define zeigBesetzt()	printf("DISPLAY:		Besetzt\n")
#define zeigFrei()	printf("DISPLAY:		Frei\n")
#define zeig(pl)	printf("DISPLAY:	%4d Frei\n", pl)

void *car_process(void*);
void *entrance_gate(void*);
void *exit_gate(void*);
void *display(void*);

/*****************************************************************************************************/
/*****************************************************************************************************/
/*****************************************************************************************************/
/*****************************************************************************************************/


#define	SLEEP_TIME		5	/* maximum amount of time */
#define NUM_CARS	30 	/* number of cars */
#define CAPACITY	20	/* number of parking lots in car park */

pthread_t car_thread[NUM_CARS];		/* threads for all cars */
pthread_t entrance_thread;		/* threads for entrance bar */
pthread_t exit_thread;		/* threads for exit bar */
pthread_t display_thread;		/* threads for exit bar */

sem_t *carpark_entrance;
sem_t *carpark_entrance_gate;
sem_t *carpark_exit;
sem_t *carpark_exit_gate;


/** Aufgabe: **/

sem_t *carpark;

/** ENDE Aufgabe: **/

int id[NUM_CARS];				/* id parameter */


int main()
{
	int i;
	
	/************************************************/
	/* create semaphors								*/
	/************************************************/
	
	carpark_entrance_gate = sem_open("entrance-gate", O_CREAT, 666, 0);
	carpark_exit_gate = sem_open("exit-gate", O_CREAT, 666, 0);
	carpark_entrance = sem_open("entrance", O_CREAT, 666, 0);
	carpark_exit = sem_open("exit", O_CREAT, 666, 0);
	
	/** Aufgabe: create carpark seamphore here */
	
	carpark = sem_open("carpark", 666, CAPACITY);
 

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

Prozesskommunikation mit PIPES - wie funktioniert das?

[Perl] Perl OO Methodenaufruf in anderem Objekt

Samba 4 Gast Zugang unter Ubuntu funktioniert nicht

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Zurück
Oben