PDA

View Full Version : [C] in cerca di una spiegazione


tuccio`
28-06-2010, 14:32
Vorrei capire perché questo funziona:


struct flock *f1 = malloc(sizeof(struct flock));
if (f1 == NULL) {
fprintf(stderr, "Memory allocation error\n");
exit(EXIT_FAILURE);
}
if (fcntl(to_vmemd, F_GETLK, f1) < 0 || f1->l_type == F_UNLCK)
continue;


mentre quest'altro mi restituisce un valore di ritorno di fcntl minore di 0 con errno = EINVAL


struct flock f1;
if (fcntl(to_vmemd, F_GETLK, &f1) < 0 || f1.l_type == F_UNLCK)
continue;


aggiungo anche che questo secondo codice funzionava fino a ieri e la ribellione è cominciata oggi (ho modificato altre cose ovviamente, ma non credo che dovrebbero influenzare questo pezzo di codice)

sprik
29-06-2010, 10:44
Il codice mi sembra corretto, se dici che prima funzionava e poi non funzionò più devi rivedere le altre parti di codice o comunque ti rimando a questo Link (http://docs.hp.com/en/B9106-90009/fcntl.2.html) per verificare il tipo di errore.

lupoxxx87
29-06-2010, 15:32
nel secondo esempio, sono allocati tutti gli spazi corrispondenti alla struttura ?

(nel suo interno ci sono puntatori ad aree non definite ?)

tuccio`
30-06-2010, 01:38
Il codice mi sembra corretto, se dici che prima funzionava e poi non funzionò più devi rivedere le altre parti di codice o comunque ti rimando a questo Link (http://docs.hp.com/en/B9106-90009/fcntl.2.html) per verificare il tipo di errore.proprio perché ho letto il manuale non capisco:


[EINVAL]

cmd is F_GETLK, F_SETLK, or F_SETLKW, and arg or the data it points to is not valid, or fildes refers to a file that does not support locking.

Come può essere che non sia valido il puntatore alla struct f1 allocata staticamente? Se allocata dinamicamente funziona invece.

Comunque se dico che le altre parti di codice sono abbastanza indipendenti è perché la named pipe su cui acquisisco il lock rimane aperta, e infatti tutto funziona correttamente allocando dinamicamente. Il mistero, almeno, è un mistero per me, è perché allocando staticamente non funziona e dinamicamente sì. C'è qualcosa che mi sfugge?

@lupoxxx87: non so cosa intendi, forse se ci sono puntatori nella struct i cui campi devono essere riempiti opportunamente? In caso, la definizione della struct flock è quella di fcntl.h:

struct flock {
short int l_type;
short int l_whence;
off_t l_start;
off_t l_len;
pid_t l_pid;
};

Quindi dovrebbe aver allocato tutto.