Tommo
18-12-2010, 19:00
Salve,
sto sviluppando una stramaledett* tesina su Unix, e mi trovo a combattere con i semafori.
Apparentemente per nessun motivo, quando chiamo semop() (tutte le volte) la chiamata fallisce con errore EINTR, o "Interruption during the execution of the syscall".
Nello specifico succede quando chiamo per la prima volta sem_wait() dopo la creazione del semaforo.
Ovviamente trattandosi di Unix non è stato possibile trovare documentazione su questo comportamento, quindi chiedo lumi :D
Il codice è questo qua, trattasi di un thin-wrapper per la portabilità (le stesse funzioni le ho implementate anche su win32)
#ifdef _DEBUG
#define NOERROR( T ) _noerror( T, __FUNCTION__, __LINE__ )
#else
#define NOERROR( T ) (T==ERROR ? ERROR : 1)
#endif
int _noerror( int e, const char* func, int line )
{
if( e == ERROR )
{
printf( "Error at %d:%s() \"%s\"\n", line, func, strerror( errno ) );
DEBUG_ASSERT(0);
return ERROR;
}
return 1;
}
int sem_create( int amount )
{
int s;
DEBUG_ASSERT( amount >= 0 );
s = semget( IPC_PRIVATE, 1, 0666 | IPC_CREAT | IPC_EXCL ); //1 solo semaforo
//inizializza il semaforo a "amount" per simulare il comportamento Win32
if( NOERROR( s ) && NOERROR( semctl( s, 0, SETVAL, amount ) ) )
return s;
return -1;
}
int sem_op( int SID, int op )
{
struct sembuf oper;
DEBUG_ASSERT( SID > 0 );
oper.sem_num = 0;
oper.sem_op = op;
oper.sem_flg = 0;
return NOERROR( semop( SID, &oper, 1 ) );
}
int sem_wait( int SID )
{
return sem_op( SID, -1 );
}
int sem_signal( int SID )
{
return sem_op( SID, 1 );
}
Boh.
sto sviluppando una stramaledett* tesina su Unix, e mi trovo a combattere con i semafori.
Apparentemente per nessun motivo, quando chiamo semop() (tutte le volte) la chiamata fallisce con errore EINTR, o "Interruption during the execution of the syscall".
Nello specifico succede quando chiamo per la prima volta sem_wait() dopo la creazione del semaforo.
Ovviamente trattandosi di Unix non è stato possibile trovare documentazione su questo comportamento, quindi chiedo lumi :D
Il codice è questo qua, trattasi di un thin-wrapper per la portabilità (le stesse funzioni le ho implementate anche su win32)
#ifdef _DEBUG
#define NOERROR( T ) _noerror( T, __FUNCTION__, __LINE__ )
#else
#define NOERROR( T ) (T==ERROR ? ERROR : 1)
#endif
int _noerror( int e, const char* func, int line )
{
if( e == ERROR )
{
printf( "Error at %d:%s() \"%s\"\n", line, func, strerror( errno ) );
DEBUG_ASSERT(0);
return ERROR;
}
return 1;
}
int sem_create( int amount )
{
int s;
DEBUG_ASSERT( amount >= 0 );
s = semget( IPC_PRIVATE, 1, 0666 | IPC_CREAT | IPC_EXCL ); //1 solo semaforo
//inizializza il semaforo a "amount" per simulare il comportamento Win32
if( NOERROR( s ) && NOERROR( semctl( s, 0, SETVAL, amount ) ) )
return s;
return -1;
}
int sem_op( int SID, int op )
{
struct sembuf oper;
DEBUG_ASSERT( SID > 0 );
oper.sem_num = 0;
oper.sem_op = op;
oper.sem_flg = 0;
return NOERROR( semop( SID, &oper, 1 ) );
}
int sem_wait( int SID )
{
return sem_op( SID, -1 );
}
int sem_signal( int SID )
{
return sem_op( SID, 1 );
}
Boh.