2012-10-19 16 views
9

Sto sviluppando un server in C con epoll library e ho una domanda su come viene gestita la memoria per struct epoll_event. Ho notato in alcuni esempi online che, quando si effettuano le chiamate epoll_ctl, l'argomento events è allocato sullo stack e poi viene passato il puntatore, in questo modo:Gestione memoria con struct epoll_event

struct epoll_event ev; 
ev.events = EPOLLIN; 
epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev); 

Ora sappiamo tutti cosa succede a ev quando il funzione restituisce. La mia domanda è: la libreria epoll fa copie di questi valori internamente o si basa sulla struttura che hai passato per essere allocata su heap? L'esempio sopra descritto interromperà totalmente l'implementazione del mio reattore? In tal caso, qual è il modo migliore per tenere traccia delle mie strutture assegnate allo stack epoll_event?

Grazie per il vostro tempo.

+0

Se "sappiamo tutti cosa succede", allora perché lo chiedi? –

+0

Quando dico "sappiamo tutti cosa succede" intendo che la memoria allocata nello stack viene rilasciata quando la funzione ritorna. –

risposta

11

Tutto va bene. La funzione epoll_ctl è un semplice wrapper attorno ad una chiamata di sistema che sarà completamente completa quando la funzione ritorna. Non sono richiesti ulteriori dati dallo spazio utente. La struct è semplicemente un modo per impacchettare gli argomenti.

7

È assolutamente necessario gettare immediatamente o riutilizzare la struttura di epoll_event.

Il kernel copia i parametri fuori dalla struttura epoll_event.

Questo è esattamente lo stesso come se si usasse un ioctl che accetta una struct come parametro, o un'operazione di socket (ad esempio bind) che prende una struct sockaddr_in.

Il kernel prende ciò di cui ha bisogno ed è subito ok per liberarlo.

L'unica cosa di cui devi preoccuparti sono i "dati utente", che sono rilevanti solo per te. Il kernel lo memorizzerà, ma è necessario sapere cosa significa quando si ottiene un evento.

+0

Grazie. Upvoted. Segnerò comunque la risposta di Kerrek SB, perché ha risposto circa un minuto prima di te. –

3

epoll è un insieme di syscall, non una libreria. Quando chiamate le syscalls epoll inserite il kernel, e in genere il kernel non si fida di questi buffer user mode per essere necessariamente validi o rimanenti, ma piuttosto copia nella memoria del kernel tramite copy_from_user ecc. Quindi sì, è possibile impostare le strutture su lo stack, passare i loro indirizzi a syscall, quindi scartarli dopo che ritorna.