PDA

View Full Version : Aiuto! Cygwin e "Bad System Call" con i semafori


bertoz85
23-02-2006, 11:42
Spero che mi riusciate a dare una mano per questo esercizio del cavolo che devo fare epr un esame .... :muro:
Si tratta di un problema di concorrenza da risolvere con i semafori e thread posix (pthread, semget, etc....)

Ho installato cygwin (non ho linux e non ditemi di metterlo per sto esame :muro: ) e scritto il seguente codice:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>


#define N 10 // numero di thread

int semid;
int stato = LIBERO;
pthread_t tr[N];

[...] // dichiarazioni varie

union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};

[...] // funzioni varie

void *funz_thread(void *ptr)
{
printf("Thread %d entra\n", *(int*) ptr);
sleep(5);
printf("Thread %d esce\n", *(int*) ptr);
}

int main()
{
int i;
union semun arg, dealloc;
unsigned short values[3];
int numthread[N];
key_t semkey;

// ALLOCAZIONE E INIZIALIZZAZIONE SEMAFORI
semkey = ftok("/cygdrive/d/Programmi/UNIVERSITA\'/SO/Progetto/Es1/es1.cpp", 1000);
semid = semget(semkey, 3, IPC_CREAT | 0660);

values[0] = 0;
values[1] = 0;
values[2] = 0;
arg.array = values;
int j = semctl(semid,0,SETALL,&arg);
printf("Semid %d\nj %d",semid,j);


// INIZIALIZZAZIONE THREAD
for (i=0; i<N; i++)
numthread[i] = i+1;
for (i=0; i<N; i++)
pthread_create( &tr[i], NULL, funz_thread, (void*)&numthread[i]);



// ATTESA DEI THREAD
for (i=0; i<N; i++)
pthread_join( tr[i], NULL);


// DEALLOCAZIONE SEMAFORI
semctl(semid,1,IPC_RMID,dealloc);

return 0;
}

si compila, però quando lo eseguo mi dà "Bad system call" ed esce!! :cry:
se commento tutta la parte dell'inizializzazione dei semafori allora funziona, i thread partono e escono.
altrimenti dà sto errore, penso in semget dato che se metto prima la printf allora stampa e poi dà errore, altrimenti da solo errore e stop :muro: :mad:
ovviamente controllare errno dopo semget non vale, dato che dopo l'errore il programma esce direttamente senza eseguire ....

cos'ho sbagliato??? :cry: :cry: :cry: l'ordine degli include, sempre che cambi qualcosa?
forse devo settare qualche variabile visto che è cygwin e forse nn è 100% compatibile?

ciao e aiutatemi!!!!!!! :cry:
grazie

Fenomeno85
23-02-2006, 11:44
non ho guardato il codice ma cyg fa cacare.
Non puoi usare una versione live o emulare linux?

~§~ Sempre E Solo Lei ~§~

bertoz85
23-02-2006, 12:08
non ho guardato il codice ma cyg fa cacare.
Non puoi usare una versione live o emulare linux?

~§~ Sempre E Solo Lei ~§~
guarda il codice le linee cruciali son 2 su dai :D
cmq DEVO risolvere con cygwin dato che sicuramente è una ca**ata impossibile che nn si risolva!!! su cygwin ci mandano apache mysql postgre che useranno minimo 100 semafori e IL MIO esercizietto nn va? :mad:

e poi in ogni caso dovrei scaricarmi un intera distribuzione e in un caso o nell'altro è sempre una palla :mad:

dai ti prego :D

ilsensine
23-02-2006, 12:16
"bad system call" vuol dire...system call non implementata. Potrebbe darsi che cygwin non emula una delle syscall richieste; alcune delle quali non sono affatto "una ca***ata" da emulare ;)

Puoi risolvere il problema in altro modo, in verità: visto che usi i thread, puoi cercare di cavartela con gli oggetti pthread, senza utilizzare affatto gli oggetti IPC come i semafori IPC.

bertoz85
23-02-2006, 14:54
ho scoperto che i servizi IPC per cygwin sstanno in un pacchetto che si chiama "cygserver" ... ora devo solo capire come installarlo ...

grazie comunque

p.s. il codice andava bene? :D

Fenomeno85
23-02-2006, 15:13
ho scoperto che i servizi IPC per cygwin sstanno in un pacchetto che si chiama "cygserver" ... ora devo solo capire come installarlo ...

grazie comunque

p.s. il codice andava bene? :D

guarda che se prendevi una versione live a quest'ora avevi scritto il nuovo kernel di unix

~§~ Sempre E Solo Lei ~§~

bertoz85
23-02-2006, 18:30
guarda che se prendevi una versione live a quest'ora avevi scritto il nuovo kernel di unix

~§~ Sempre E Solo Lei ~§~
no grazie :D
cmq ho risolto con cygserver grazie lo stesso.....

ciao