<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <atom:link href="https://jacek.zlydach.pl/blog/tags/unix-feed.xml" rel="self" type="application/rss+xml"/>
    <title>Posts tagged: Unix - Jacek Złydach - blog</title>
    <link>https://jacek.zlydach.pl/blog/tags/unix.html</link>
    <lastBuildDate>Tue, 25 Jan 2022 12:54:25 +0100</lastBuildDate>
    <description>Blog of Jacek Złydach - a programmer and science enthusiast.</description>
    <generator>Regenerate2</generator>
    <managingEditor>temporal.pl@gmail.com (Jacek Złydach)</managingEditor>
    <webMaster>temporal.pl@gmail.com (Jacek Złydach)</webMaster>
    <ttl>1440</ttl>
    <copyright>© 2017, 2018, 2019, 2020, 2021, 2022, Jacek Złydach</copyright>
    <item>
      <title>QED - UNIX API w wersji trochę bardziej przyjaznej</title>
      <link>https://jacek.zlydach.pl/blog/2010-02-25-qed-unix-api-w-wersji-troche-bardziej-przyjaznej.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2010-02-25-qed-unix-api-w-wersji-troche-bardziej-przyjaznej.html</guid>
      <pubDate>Thu, 25 Feb 2010 20:25:56 +0100</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/cpp.html">C++</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/narzedzia.html">narzędzia</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/linux.html">Linux</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/unix.html">Unix</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/qed.html">QED</category>
      <description><![CDATA[<a href="projects.html#qed">Chciałbym opublikować kawałek kodu</a>, który napisałem pod wpływem emocji w ramach nauki na końcowe kolokwium z systemów operacyjnych. Zadania, które dostawaliśmy tam były niemożliwe do zrobienia bez dobrej znajomości API UNIXa dotyczącego <a href="http://pl.wikipedia.org/wiki/Komunikacja_mi%C4%99dzyprocesowa">komunikacji międzyprocesowej</a> i przygotowania sobie jakiegoś kodu wcześniej. Teoretycznie można było korzystać z Internetu i dowolnych własnych zasobów, ale bez wstępnego przygotowania nie było szans ;). Większość znajomych przygotowywała więc sobie rozwiązania dotychczasowych zadań z laboratorium w nadziei, że będą się dały zaadaptować do kolokwium.

QED, bo tak nazywa się biblioteka, powstała jako wynik frustracji po słabym zaliczeniu pierwszego terminu. Opakowuje ona całe to przykre i bolesne w użyciu API <a href="http://pl.wikipedia.org/wiki/Komunikacja_mi%C4%99dzyprocesowa">IPC</a> UNIX'a do postaci prostych klas i funkcji C++. Większość zadań da się zrobić bez ani jednej linii kodu w czystym UNIXowym API :).

<a href="projects.html#qed"><strong>Biblioteka QED oraz przykładowe zadania z laboratoriów / kolokwium.</strong></a>

Biblioteczka ta zawiera:
<ul>
	<li>Uproszczony <a href="http://www.boost.org/doc/libs/1_42_0/libs/conversion/lexical_cast.htm"><code lang="C++" inline="true"><span class="no-paren-fx">lexical_cast</span></code></a></li>
	<li>Obiekty do łatwego synchronizowania operacji na <code lang="C++" inline="true"><span class="no-paren-fx">std::ostream</span></code>(tak, na <code lang="C++" inline="true"><span class="no-paren-fx">std::cout</span></code> też!) w programach wielowątkowych</li>
	<li>Funkcję do pobierania czasu z milisekundową rozdzielczością</li>
	<li>Pomocnicze makra zastępujące powtarzający się w kółko kod</li>
	<li>Pomocnicze funkcje do <strong>wygodnego</strong> <code lang="C++" inline="true"><span class="no-paren-fx">fork<span class="paren1">(<span class="no-paren-fx"></span>)</span></span></code> (łącznie z przepinaniem STDIN i STDOUT dziecka); <a href="http://en.wikipedia.org/wiki/Fork-exec">fork-exec idiom</a> trzeba sobie zrobić samemu, ale co to za problem wywołać sobie funkcję <code lang="C++" inline="true"><span class="no-paren-fx">exec<span class="paren1">(<span class="no-paren-fx"></span>)</span></span></code> :P.</li>
	<li>Klasy izolujące <a href="http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html#pipes">nienazwane</a> i nazwane <a href="http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html#fifos">pipe'y (FIFO)</a>, <a href="http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html#semaphores">semafory</a>, <a href="http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html#shm">pamięć współdzieloną</a> i <a href="http://beej.us/guide/bgipc/output/html/singlepage/bgipc.html#mq">kolejki komunikatów</a></li>
	<li>Inne pomocnicze funkcje</li>
</ul>

Mam szczerą nadzieję, że kod ten przyda się przynajmniej tym z Czytelników, którzy już za rok (albo i wcześniej) zmierzą się z Systemami Operacyjnymi na IS :).

Dlaczego taka nazwa? QED oznacza <a href="http://pl.wikipedia.org/wiki/Elektrodynamika_kwantowa">elektrodynamikę kwantową</a> - bardzo pokręconą dziedzinę fizyki, o której czytałem sobie &quot;do obiadu&quot; w okresie prac nad powyższą biblioteką. <a href="http://pl.wikipedia.org/wiki/Q.e.d.">Q.E.D.</a> to też łaciński skrót oznaczający <em>Quod erat demonstrandum</em> (&quot;Co było do udowodnienia&quot;) - co dobrze współgrało z moją frustracją po pierwszym terminie (na zasadzie: &quot;no, na drugim pokażę!&quot;).

Dla niewystarczająco przekonanych, przykład kodu:
<pre><code lang="C++"><span class="no-paren-fx"><span class="comment">//================================================================
</span><span class="comment">//Beta section
</span><span class="comment">//================================================================
</span><span class="symbol">int</span> process_beta<span class="paren1">(<span class="no-paren-fx"><span class="symbol">void</span>* data</span>)</span>
<span class="paren1">{<span class="no-paren-fx">
	betaQueue.attach<span class="paren2">(<span class="no-paren-fx"></span>)</span>;
	alphaSharedQueue.attach<span class="paren2">(<span class="no-paren-fx"></span>)</span>;

	<span class="symbol">char</span> buffer<span class="paren2">[<span class="no-paren-fx">1024</span>]</span>;

	<span class="symbol">while</span><span class="paren2">(<span class="no-paren-fx"><span class="symbol">true</span></span>)</span>
	<span class="paren2">{<span class="no-paren-fx">
		std::memset<span class="paren3">(<span class="no-paren-fx">buffer, 0, 1024*<span class="symbol">sizeof</span><span class="paren4">(<span class="no-paren-fx"><span class="symbol">char</span></span>)</span></span>)</span>;
		
		<span class="comment">//get data from msg queue
</span>		betaQueue.receive_message<span class="paren3">(<span class="no-paren-fx">buffer</span>)</span>;

		<span class="comment">//cut out last two letters
</span>		buffer<span class="paren3">[<span class="no-paren-fx">std::max<span class="paren4">(<span class="no-paren-fx"><span class="symbol">static_cast</span>&lt;<span class="symbol">int</span>&gt;<span class="paren5">(<span class="no-paren-fx">std::strlen<span class="paren6">(<span class="no-paren-fx">buffer</span>)</span></span>)</span> - 2, 0</span>)</span></span>]</span> = <span class="character">'\0'</span>;

		<span class="comment">//send data via message queue to P1
</span>		alphaSharedQueue.send_message<span class="paren3">(<span class="no-paren-fx">buffer</span>)</span>;
	</span>}</span>

	<span class="symbol">return</span> 0;
</span>}</span></span></code></pre>
Oto kod procesu, który odbiera informacje z kolejki komunikatów, obcina im dwa ostatnie znaki i wysyła je inną kolejką komunikatów.
Teraz, wyobraź sobie, że piszesz w czystym UNIX API :P.
]]></description>
    </item>    <item>
      <title>Najlepsze z dwóch światów - Cygwin vs Services for Unix-based Applications pod Windows 7</title>
      <link>https://jacek.zlydach.pl/blog/2009-10-13-najlepsze-z-dwoch-swiatow-cygwin-vs-services-for-unix-based-applications-pod-windows-7.html</link>
      <guid isPermaLink="true">https://jacek.zlydach.pl/blog/2009-10-13-najlepsze-z-dwoch-swiatow-cygwin-vs-services-for-unix-based-applications-pod-windows-7.html</guid>
      <pubDate>Tue, 13 Oct 2009 09:11:44 +0200</pubDate>
      <category domain="https://jacek.zlydach.pl/blog/tags/old-blog.html">Old blog</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/windows.html">Windows</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/vista.html">Vista</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/cygwin.html">Cygwin</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/sua.html">SUA</category>
      <category domain="https://jacek.zlydach.pl/blog/tags/unix.html">Unix</category>
      <description><![CDATA[<blockquote>Wykorzystuj moc powłoki</blockquote>Powyższa rada pochodząca z <em><a href="http://merlin.pl/Pragmatyczny-programista-Od-czeladnika-do-mistrza_Andrew-Hunt-David-Thomas/browse/product/1,299928.html">&quot;Pragmatycznego Programisty&quot;</a></em> zapewne jest oczywista dla użytkowników systemu UNIX, jednak osoby pracujące pod Windowsem często nie zdają sobie sprawy, jak wielkim usprawnieniem jest dobry zestaw narzędzi konsolowych. Powszechnie wiadomo, że procesor poleceń CMD.EXE nie grzeszy funkcjonalnością, jednak istnieją sposoby poszerzenia możliwości systemu Windows w zakresie aplikacji konsolowych.

Użytkownicy wersji Enterprise lub wyższych systemu Windows Vista i Windows 7 dysponują funkcją <a href="http://en.wikipedia.org/wiki/Subsystem_for_UNIX-based_Applications">Subsystem for Unix-based Applications</a> (w skrócie SUA, znane też jako SFU lub Interix). Ten element systemu komunikuje się bezpośrednio z jądrem systemu Windows i pozwala aplikacjom Uniksowym działać obok zwykłych aplikacji systemu Windows. Ponieważ API Uniksa działa tutaj równolegle do WinAPI można powiedzieć, że system rozdwaja się i po części staje się Uniksem - narzędzia z tego systemu działają na Windowsie natywnie, bez pośredniej emulacji.

<a href="old-blog/download/posts/SUA/sua.png"><img src="old-blog/download/posts/SUA/sua-450.png" alt="SUA pod Windows 7"></a>
<em>SUA pod Windows 7 radzi sobie zarówno w tradycyjnej konsoli jak i z aplikacjami X-Window.</em>

Po aktywacji i ściągnięciu potrzebnego pakietu SUA zawiera jedynie podstawowy zestaw narzędzi. Całą resztę - w sumie ponad 400 różnych programów - możemy pobrać ze strony <a href="http://www.suacommunity.com/">SUA Community</a>. Wśród dostępnych aplikacji znajdziemy m.in. ls, awk, grep, perl, ssh, xterm czy vim. SUA nie zawiera serwera X - ten ostatni musimy ściągnąć sami. Istnieją darmowe i płatne alternatywy; ja obecnie korzystam z <a href="http://www.straightrunning.com/XmingNotes/">Xming</a>.

Użytkownicy innych wersji systemu Windows 'skazani' są na <a href="http://pl.wikipedia.org/wiki/Cygwin">pakiet Cygwin</a>. Korzystałem z niego pod Windows 2000 i Windows 2003 Server; pakiet ten spisywał się znakomicie. W dużym skrócie, Cygwin to zestaw DLLek emulujących interfejs unikowych bibliotek C i zapewniający kompatybilność z <a href="http://en.wikipedia.org/wiki/POSIX">POSIX</a>.  W oparciu o nie skompilowano całą masę przeróżnych narzędzi unikowych - począwszy od <a href="http://en.wikipedia.org/wiki/Coreutils">coreutils</a> i <a href="http://en.wikipedia.org/wiki/GNU_Binary_Utilities">binutils</a>, przez interpretery Perla, Pythona, kompilator TeX, na narzędziach i Window Managerach dla X-Window skończywszy. Dostępnych składników systemu jest wielokrotnie więcej niż w przypadku SUA. Całość wyposażona jest w dość wygodny (aczkolwiek <a href="http://pl.wikipedia.org/wiki/Plik:Cygwin-setup.png">niezbyt prosty w obsłudze</a>) instalator pozwalający w dowolnej chwili aktualizować lub wgrywać nowe pakiety.

<a href="old-blog/download/posts/SUA/skrin.png"><img src="old-blog/download/posts/SUA/skrin-450.png" alt="Cygwin pod Windows 2000"></a>
<em>Xterm'y Cygwina pracujące równolegle z aplikacjami Windows 2000.</em>

<a href="old-blog/download/posts/SUA/iridium.png"><img src="old-blog/download/posts/SUA/iridium-450.png" alt="Konstelacja Iridium w aplikacji pod Cygwinem"></a>
<em>Aplikacja X-Window składająca się z dwóch programów nie wchodzących w skład pakietu Cygwin, lecz ściągniętych i skompilowanych osobno ze źródeł.</em>

Używałem Cygwina przez liceum oraz początek studiów i mogę powiedzieć, że - po odrobinie zabawy w upiększanie i dostosowywanie - jest to wspaniałe narzędzie. Niestety, pod systemem Windows 7 występuje poważny problem z działaniem aplikacji Cygwinowych - zgaduję, że jest to spowodowane randomizacją przestrzeni adresowej wprowadzoną wraz z Windows Vista. Częstość i przypadkowość awarii praktycznie dyskwalifikuje Cygwina jako narzędzie pod Windows 7; chyba, że ktoś zna metodę jak doprowadzić produkt Cygnusa do ładu.

Cechą wspólną obydwu pakietów jest konieczność rekompilacji każdego dodatkowego narzędzia, którego zechcemy używać - uniksowe binarki nie mogą 'tak po prostu' uruchamiać się pod Windowsem. Ponadto domyślnie oba posiadają nieaktualne zestawy narzędzi - na przykład GCC starsze niż kierunek, na którym studiuję. Wybija się tutaj SUA - narzędzia ściągane z SUA Community są stosunkowo nowe. Pod Cygwinem jednak dostępnych narzędzi jest dużo więcej - wliczając brakujący w SUA serwer X. W obecnej chwili mam też małe problemy z uruchomieniem kolorowania kodami ANSI Escape w xterm'ie pod SUA - z Cygwinem nie było tego problemu.

Alternatywą dla powyższych dwóch rozwiązań jest pakiet <a href="http://ppt.sourceforge.net/">Perl Power Tools</a> będący implementacją podstawowych narzędzi Uniksa w języku Perl. Inną opcją jest też pakiet <a href="http://en.wikipedia.org/wiki/UWIN">UWIN</a>. Pod Windowsem mamy też oczywiście <a href="http://en.wikipedia.org/wiki/PowerShell">PowerShell'a</a>; jest to narzędzie oparte o zupełnie inne założenia niż system Unix. Różnica ta daje mu możliwości, z którymi warto się zapoznać.

Ktoś mógłby zapytać: dlaczego nie zainstalować Linuksa na wirtualnej maszynie? Otóż nawet istnienie współdzielonych folderów nie daje tej swobody użycia narzędzi UNIX przy pracy nad projektami w systemie Windows. W przypadku wirtualnej maszyny mamy wyraźne rozdzielenie systemu-gospodarza i systemu-gościa; mieszanie funkcjonalności obu systemów przy pracy nad jednym projektem, choć technicznie możliwe, jest dosyć skomplikowane.

Chociaż SUA w obecnej chwili wymaga Windowsów w wersji dostępnej dla niewielu, warto być świadomym istnienia tego pakietu - może przyjść czas, w którym będzie on dostępny także na tańszych wersjach systemu, może też przyjdzie zetknąć się z nim w pracy zawodowej. Niezależnie od tego, które z omówionych narzędzi jest dla nas dostępne warto zastanowić się, czy nasze obecne i przyszłe projekty nie mogłyby skorzystać z potęgi narzędzi Uniksowych pod systemem Windows.

PS. Tak, przesiadłem się na Windows 7 :).
]]></description>
    </item>
  </channel>
</rss>