2010-09-12 13 views
8

Sto scrivendo una semplice shell come assegnazione del corso OS, ho bisogno di cercare nel PATH per trovare l'utente del programma digitato, una volta trovata la directory giusta, ho malloc un pezzo di memoria quel tanto che basta per contenere il nome della directory più il nome del programma, e lo passo come primo argomento per execv().Cosa succede alla memoria allocata dinamica quando si chiama execv()?

Avrei potuto assegnare staticamente 100 caratteri o giù di lì, ma avere un limite mi fa sentire a disagio. Quindi, quando execv() viene eseguito, l'heap viene ripulito o viene perso quel pezzo di memoria?

Forse non è un sacco di memoria, ma sono solo curioso.

+1

Se è stato allocato staticamente un buffer per contenere il percorso, deve essere almeno la lunghezza massima che può essere un percorso assoluto di Linux. Una ricerca su google rivela che questo è "4096" (da/usr/src/linux-2.4.20-8/include/linux/limits.h', '#define PATH_MAX 4096/* # caratteri in un nome di percorso che include nul */'). Quindi dovresti includere 'limits.h' e rendere i caratteri del tuo' PATH_MAX' del buffer in lunghezza. – Praetorian

risposta

8

Quando si exec(), l'intero processo è (a) terminato, quindi tutte le risorse, inclusa la memoria dinamica e alcuni file fd come di seguito, vengono recuperati dal sistema operativo e (b) sostituiti: codice, dati, thread, .. .

descrittori Re di file, da "man execve":

descrittori di file aperti l'immagine processo chiamante in rimangono aperte la nuova immagine processo, ad eccezione di quelli per i quali è impostato il close-on-exec bandiera (vedi chiudi (2) e fcntl (2)). I descrittori che rimangono aperti non sono interessati da execve().

+3

Forse è ovvio, ma questo è vero solo per un exec di successo. Se non riesce, il processo originale continuerà con la memoria allocata dinamicamente ancora allocata. – mark4o

+1

In altre parole, la chiamata 'exec()' assegna i suoi argomenti da qualche parte nella memoria fuori dallo spazio del processo originale, in modo che quando sostituisce l'immagine eseguibile con il programma exec'd, quegli argomenti sono sul nuovo stack di chiamate iniziali per 'main()'. –

+3

@DavidRTribble Gli argomenti 'exec()' vengono copiati nello spazio del kernel in quanto si tratta di una chiamata di sistema. Niente di speciale su 'exec()' a questo riguardo. – EJP

Problemi correlati