Co to jest wywołanie systemowe w systemie Linux i jak działa z przykładami

What Is System Call Linux



Wywołanie systemowe to funkcja, która umożliwia procesowi komunikowanie się z jądrem Linuksa. To tylko programowy sposób, w jaki program komputerowy zamawia obiekt z jądra systemu operacyjnego. Wywołania systemowe udostępniają zasoby systemu operacyjnego programom użytkownika poprzez API (interfejs programowania aplikacji). Wywołania systemowe mają dostęp tylko do struktury jądra. Wywołania systemowe są potrzebne dla wszystkich usług, które potrzebują zasobów.

Jądro Linuksa to zastrzeżone oprogramowanie, które ładuje się i działa na urządzeniu na najmniej potencjalnym etapie. Jego zadaniem jest organizowanie wszystkiego, co dzieje się na komputerze, od klawiatury, dysku i zdarzeń sieciowych po udostępnianie przedziałów czasowych dla równoczesnego wykonywania różnych programów. Oddzielenie oprogramowania i sprzętu tworzy bezpieczną bańkę, która poprawia ochronę i niezawodność. Nieuprzywilejowane aplikacje nie są w stanie uzyskać dostępu do pamięci innego programu, a jeśli jeden z nich się nie powiedzie, jądro zawiesza proces, aby nie uszkodzić całego systemu.







Cienkie opakowanie waflowe:

Wywołania systemowe Linuksa nie są jawnie renderowane do jądra w niektórych programach. Prawie wszystkie programy korzystają z podstawowej biblioteki C i oferują lekkie, ale niezbędne opakowanie wywołań systemowych Linuksa. Repozytorium udostępnia następnie towarzyszące wywołanie maszyny Linux po upewnieniu się, że parametry funkcji są tłumaczone na właściwe rejestry procesora. Za każdym razem, gdy wrapper otrzymuje dane z wywołania systemowego, analizuje je i w wyraźny sposób wprowadza do programu. Każda operacja interaktywna z maszyną w programie jest ostatecznie przekształcana w wywołanie systemowe. Przyjrzyjmy się więc niektórym z nich. Istnieje długa lista wywołań systemowych Linux, których możemy używać w naszym systemie Linux. Oto lista niektórych popularnych i najczęściej używanych wywołań systemowych Linuksa.



  • otwarty
  • Blisko
  • Exec
  • Pisać
  • Czytać
  • Lseek
  • Wybierz

Omówmy niektóre wywołania systemu Linux przy użyciu języka C w naszym artykule, aby się z nim zapoznać.



Otwórz wywołanie systemowe:

Możemy użyć wywołania systemowego Open w naszej dystrybucji Linuksa, aby szybko otworzyć dokument, który określimy w naszym kodzie języka C. Najpierw uruchom terminal poleceń. Możesz użyć skrótu Ctrl+Alt+T. Załóżmy, że masz plik tekstowy test.txt w katalogu domowym i zawiera on pewną zawartość. Tak więc na początku musisz utworzyć nową nazwę pliku typu C new.c w terminalu za pomocą edytora nano. Dlatego wypróbuj poniższą prostą instrukcję nano.





$nanonowy.c

Teraz uruchomiono edytor Nano. Wpisz w nim pokazany poniżej kod. W kodzie mamy dwa deskryptory plików. Oba pliki można otworzyć za pomocą otwartego wywołania systemowego. Pierwszy deskryptor zawiera wywołanie odczytu, a drugi zawiera funkcję zapisu. Pierwszym otwartym wywołaniem jest otwarcie pliku tekstowego test.txt i zapisanie jego zawartości w deskryptorze pliku fd. Drugim otwartym wywołaniem systemowym jest utworzenie pliku o nazwie target. Cel dokumentu został zwrócony do deskryptora pliku fd1. Instrukcja write służy do transkrypcji bajtów danych w buforze. Stuknij Ctrl + S, aby zapisać kod, i naciśnij klawisz skrótu Ctrl + X, aby zamknąć plik.



Uruchom instrukcję kompilacji gcc, aby skompilować ten kod C.

$gccnowy.c

Wykonajmy kod za pomocą prostego zapytania a.out w powłoce w następujący sposób:

$./a.out

Dane wyjściowe zostały przesłane do pliku docelowego. Sprawdźmy plik docelowy za pomocą zapytania cat. Ekran wyjściowy pokazuje 20-znakowe dane w pliku docelowym.

$Kotcel

Wywołanie systemowe Exec:

Wywołanie systemowe exec jest odrzucane, aby uruchomić plik, który jest aktualnie przetwarzany. Poprzedni plik wykonywalny jest zastępowany, a bieżący plik jest obsługiwany przy każdym wywołaniu exec. Używając wywołania systemowego exec, możemy założyć, że spowoduje to nadpisanie starego dokumentu lub aplikacji w pętli nowym. Nowe oprogramowanie jest używane do nadpisania całego materiału procesu. Dokument, którego tytuł jest podany w instrukcji przy każdym wywołaniu exec(), jest zastępowany sekcją informacji o użytkowniku, która uruchamia wywołanie systemowe exec() (). Otwórz terminal poleceń i za pomocą edytora nano utwórz nowy plik typu C w następujący sposób:

$nanodośw.c

Edytor został już otwarty. Napisz w nim cały poniższy kod języka C. Znajdują się w nim trzy główne biblioteki. Następnie została utworzona instancja głównej funkcji. Oświadczenie print pokazywało dane ciągu i identyfikator procesu pliku exp.c. W tym celu została użyta funkcja getpid(). Następnie mamy tablicę typów znaków z pewnymi wartościami. Wywołanie systemowe exec zostało użyte do pobrania nazwy pliku i tablicy o jeden wiersz powyżej jako argumentu. Teraz plik hello.c zostanie przetworzony. Następnie pojawia się kolejna instrukcja print, ale nigdy nie zostanie wykonana. Naciśnij Ctrl+S, aby zapisać ten plik. Naciśnij Ctrl+X, aby wyjść.

Teraz nadszedł czas na utworzenie kolejnego pliku c, hello.c za pomocą edytora nano. Aby to zrobić, użyj poniższego zapytania w powłoce.

$nanocześć, c

Napisz w nim poniższy kod. Ten kod zawiera dwie instrukcje print w funkcji main. Pierwsza wypisuje tylko podany w niej łańcuch, a druga wypisuje ten łańcuch podczas pobierania identyfikatora procesu aktualnie używanego pliku, którym jest hello.c.

Skompilujmy oba pliki jeden po drugim za pomocą gcc.

$gcc–o exp.c

$gcc–O cześć witam.c

Kiedy wykonamy plik exp.c, wypisze pierwszą instrukcję print z pliku exp.c i obie linie print z pliku hello.c.

$./do potęgi

Wniosek:

Omówiliśmy całą koncepcję wywołań systemowych Linuksa i sposób ich użycia w systemie Linux. Podczas wdrażania tej koncepcji korzystaliśmy z Ubuntu 20.04.