Jeśli kompiluję program za pomocą gcc i próbuję go uruchomić z powłoki bash, jaka jest dokładna sekwencja kroków, po których następuje bash, aby go wykonać?
Wiem fork()
, execve()
, loader
, dynamic linker
(i inne rzeczy) są zaangażowane, ale może ktoś podać dokładną sekwencję kroków i trochę odpowiedniego odniesienia do czytania?
Edytować:
Z odpowiedzi wynika, że pytanie może sugerować wiele możliwości. Chcę zawęzić do prostej sprawy:
(test.c po prostu drukuje hello world)
$ gcc test.c -o test
$ ./test
Jakie będą kroki w powyższym przypadku ( ./test
), szczególnie związane z uruchomieniem programu bash w niektórych procesach potomnych, ładowaniem, łączeniem itp.?
shell
process
executable
Jake
źródło
źródło
Odpowiedzi:
Cóż, dokładna sekwencja może się różnić, ponieważ może istnieć alias powłoki lub funkcja, która najpierw zostanie rozwinięta / zinterpretowana przed uruchomieniem właściwego programu, a następnie różnice dla kwalifikowanej nazwy pliku (
/usr/libexec/foo
) w porównaniu do czegoś, co będzie wyszukiwane we wszystkich katalogach oPATH
zmiennej środowiskowej (tylkofoo
). Ponadto, szczegóły wykonania mogą skomplikować sprawy, ponieważfoo | bar | zot
wymaga więcej pracy dla powłoki (niektóre liczbyfork(2)
,dup(2)
oraz, oczywiście,pipe(2)
między innymi wywołań systemowych), podczas gdy cośexec foo
jest o wiele mniej pracy jako powłoka jedynie zastępuje się z nowy program (tzn. nie mafork
). Ważne są również grupy procesów (zwłaszcza grupa procesów pierwszego planu, z których wszystkie PID jedząSIGINT
kiedy ktoś zaczyna mashowanie na Ctrl+ C, sesjach i czy zadanie będzie uruchamiane w tle, monitorowane (foo &
) czy w tle, ignorowane (foo & disown
). Szczegóły przekierowania we / wy również zmienią różne rzeczy, np. Jeśli standardowe wejście zostanie zamknięte przez powłokę (foo <&-
) lub czy plik zostanie otwarty jako stdin (foo < blah
).strace
lub podobnie będzie zawierać informacje na temat konkretnych wywołań systemowych wykonanych podczas tego procesu, i dla każdego z tych połączeń powinny znajdować się strony podręcznika man. Odpowiednim odczytem na poziomie systemu będzie dowolna liczba rozdziałów z „Zaawansowanego programowania w środowisku UNIX” Stevensa, podczas gdy książka powłoki (np. „Od powłoki do powłoki Z”) bardziej szczegółowo omawia stronę powłoki.źródło
Zakładając, że przykładowa powłoka z podręcznika (dla przejrzystości kodu), która jest już uruchomiona (więc dynamiczny linker jest gotowy), wspomniane polecenia będą wymagały od powłoki wykonania następujących wywołań systemowych:
Bardziej skomplikowane polecenia oczywiście dodają więcej komplikacji do tej podstawowej sekwencji. Dwa prostsze przykłady podstawowych komplikacji to podstawowe przekierowanie io, w którym między rozwidleniem a procesami exec i tła wstawiana jest sekwencja otwierania, zamykania i duplikacji, w której oczekiwanie jest pomijane (a do obsługi sigchld dodawane jest kolejne oczekiwanie).
źródło
Proponuję przeczytać sekcję 8.4.6 Korzystanie z fork i execute do uruchamiania programów
na http://www.groupes.polymtl.ca/inf2610/documentation/ComputerSystemBook.pdf
źródło