2010-09-12 11 views
8

Piszę prostą powłokę jako przypisanie do systemu operacyjnego, muszę wyszukać w PATH, aby znaleźć wpisany program, po znalezieniu odpowiedniego katalogu, zajmiemy się fragmentem pamięci wystarczającym do przechowywania nazwy katalogu plus nazwa programu i przekazuję go jako pierwszy argument funkcji execv().Co dzieje się z dynamicznie przydzielaną pamięcią podczas wywoływania execv()?

Mogłem statycznie przyznać około 100 znaków, ale posiadanie limitu sprawia, że ​​czuję się nieswojo. Więc kiedy execv() zostanie uruchomiony, czy sterta zostanie wyczyszczona, czy utracona jest ta część pamięci?

To może nie jest dużo pamięci, ale jestem po prostu ciekawy.

+1

Jeśli statycznie przydzielono bufor do przechowywania ścieżki, musi to być co najmniej maksymalna długość ścieżki bezwzględnej Linuksa. Wyszukiwarka google wyjawia, że ​​jest to '4096' (z'/usr/src/linux-2.4.20-8/include/linux/limits.h', '#define PATH_MAX 4096/* # chars w nazwie ścieżki, w tym nul */'). Powinieneś więc włączyć 'limits.h' i wprowadzić długość znaków w buforze' PATH_MAX'. – Praetorian

Odpowiedz

8

Po exec(), cały proces jest zakończony (a), więc wszystkie zasoby, w tym pamięć dynamiczna i niektóre pliki fd, jak poniżej, są odzyskiwane przez system operacyjny, i (b) zastępowane: kod, dane, wątki, .. .

Re deskryptory plików, od "man execve":

otwartych deskryptorów plików w obrazie procesu wywołującego pozostają otwarte w nowym obrazu procesu, z wyjątkiem tych, dla których close-on-exec flaga jest ustawiona (patrz close (2) i fcntl (2)). Deskryptory, które pozostają otwarte, pozostają niezmienione przez execve().

+3

Być może jest to oczywiste, ale dotyczy to tylko udanego wykonania. Jeśli się to nie uda, oryginalny proces będzie kontynuowany z przydzieloną dynamicznie alokowaną pamięcią. – mark4o

+1

Innymi słowy, wywołanie 'exec()' przydziela swoje argumenty gdzieś w pamięci poza oryginalną przestrzenią procesową, tak że po zastąpieniu obrazu wykonywalnego programem exec'd, te argumenty znajdują się na nowym początkowym stosie wywołań dla 'main()'. –

+3

@DavidRTribble Argumenty 'exec()' są kopiowane do przestrzeni jądra, ponieważ jest to wywołanie systemowe. Nic specjalnego w 'exec()' pod tym względem. – EJP

Powiązane problemy