2014-12-18 13 views
5

Zastanawiam się, że istnieją różne funkcje w różnych systemach operacyjnych, ale służą one temu samemu celowi, lub można powiedzieć, że różne systemy operacyjne mają różne języki programowania systemowego (takie jak w systemie Windows w porównaniu z systemem UNIX).Czy implementacja bibliotek C zależy od systemu operacyjnego?

Na przykład, ponieważ biblioteka C składa się z implementacji funkcji, ich implementacja musi wywoływać różne funkcje (w zależności od systemu operacyjnego), aby zaimplementować to samo. Czy to jest poprawne? Więc, czy biblioteki są używane w cygwin do kompilowania programów napisanych specjalnie dla systemu Windows i gcc, szczególnie dla Linuksa? Mam rację? Jeśli nie, to dlaczego?

+0

To pytanie może nie być tak precyzyjne, jak być powinno, ale naprawdę nie wiem, jak wyrazić to lepiej. Uprzejmie, wybacz mi. – PalashV

+0

Czy pytasz o standardowe funkcje, takie jak 'printf()' lub 'malloc()' lub o thoose jako 'CreateThread()'? – dhein

+0

Biblioteki zawierają funkcje takie jak 'printf()', itp. I potrzebują wywołań systemowych do implementacji takich funkcji. – PalashV

Odpowiedz

4

Tak, zgadza się. Różne systemy operacyjne mają różne funkcje, które robią to samo. Na przykład w systemie Windows tworzysz wątek, wywołując CreateThread(), podczas gdy na Linuksie wywołujesz pthread_create().

W środowisku wykonawczym C wszystkie systemy operacyjne implementują je, ale w różny sposób. W systemie Windows fopen() to opakowanie, które będzie wywoływać CreateFile(), natomiast na Linuksie fopen() jest opakowaniem dla open().

Cygwin i podobne dodaje biblioteki, aby zaimplementować funkcję tylko linuksową w systemie Windows. Na przykład cygwin wdroży pthread_create() w systemie Windows, opakowując CreateThread(), podobnie jak MS dla fopen().

+0

Dzięki, miałem nadzieję, że powinno to być coś takiego, ale miałem bardzo małą wiedzę na temat systemów operacyjnych. – PalashV

+0

"podczas gdy na linux fopen() jest natywną funkcją" Mylisz się. Czy chodziło Ci o open()? – edmz

+0

@black Mój zły, zapomniałem o 'open()'. – ElderBug

1

Tak, masz to. Nie mogę wiele dodać.

Ale o ile wiem system operacyjny obsługuje biblioteki i są one po prostu połączone. Powodem tego jest to, że programiści, którzy opracowują specyficzne dla systemu implementacje, najlepiej znają swój system. Implementacja numeru fopen() polega nie tylko na zadawaniu dysku twardego dyskowi twardemu. (prawdopodobnie wiesz)

Musisz szanować wiele okoliczności innych implementacji, które współpracują z deskryptorami plików. A może trzeba polegać na czymś, co dzieje się w określonej funkcji w systemie operacyjnym, co dla zachowania generell nie jest potrzebne. Ale w twoim środowisku wszystko to działa.

To także dlatego, że norma C mówi, że zmiana kodu źródłowego standardowych bibliotek powoduje nieokreślone zachowanie, nawet jeśli funkcja ta nadal obsługuje to samo zachowanie (próbowała znaleźć cytat za ciebie, ale nie była w stanie, przepraszam.)

Więc to jest optymalizacja. Może być implementacja generell, ale ponieważ większość systemów operacyjnych opiera się na tych implementacjach, każdy system operacyjny jest zainteresowany tym, aby działały jak najlepiej dla własnego przypadku.

(prawdopodobnie nie tylko jeden, ale nie jestem aż tak głęboko w rozwoju OS jak mógłbym wymienić inny)

1

Należy pamiętać, że istnieją dwa rodzaje funkcji bibliotecznych: Użytkowe i opakowania systemowych. Załóżmy, że jesteś sprzedawcą próbującym utworzyć przenośną bibliotekę.

Funkcje użytkowe, takie jak sprintf i atoi, będą takie same w każdej implementacji, ponieważ nie potrzebują usług systemu operacyjnego.

Zwykle będziesz miał warstwę abstrakcji w swojej bibliotece. Być może funkcja, która przydziela strony pamięci, może mieć funkcję podobną do tej, która jest przypisana do pamięci. Miałoby to różne implementacje dla różnych systemów.Funkcja malloc wykorzystująca taki interfejs może być w 99% taka sama w różnych systemach operacyjnych.

2

Tak.

Aby dodać do wersji ElderBug's answer, biblioteki C, które działają jako opakowania dla różnych typów wywołań systemowych, różnią się w zależności od systemu. Wywołania systemowe, takie jak następujące (od NYU's Operating Systems, Lecture #4), przesuwają proces z trybu użytkownika do trybu administratora/jądra.

Uwaga celem rozróżnienia między trybie użytkownika (owijki) i trybie jądra (wdrażania systemu operacyjnego”), from the lecture:

Ważnym celem OS jest takie proste semantyka wywołanie procedury są przestrzegane od A punkt widzenia procesu użytkownika. Złożoność jest ukryta wewnątrz samego jądra, co stanowi kolejny przykład systemu operacyjnego zapewniającego bardziej abstrakcyjną, tj. Prostszą wirtualną maszynę dla procesów użytkownika.

enter image description here

Jak wiadomo, te przykładowe połączenia nie są podobne w różnych systemach operacyjnych, takich jak Windows i Linux, ale nazwy funkcji C otoki są --otherwise, wstępnie skompilowana sam język byłby różny w różnych systemach.

Nadzieję, że pomaga!

Powiązane problemy