Linuksowy Poradnik Olimpiady Informatycznej 1 Wst¦p 2 Czytanie i
Transkrypt
Linuksowy Poradnik Olimpiady Informatycznej 1 Wst¦p 2 Czytanie i
Linuksowy Poradnik Olimpiady Informatycznej Marek ylak 21 marca 2006 1 Wst¦p nia katalogu domowego nale»¡cego do aktualnie zalogowanego u»ytkownika. Dokument ten powstaª m.in. na podstawie do- Linuks jest systemem operacyjnym, w któ- ±wiadcze« studentów zdobytych podczas zawo- rym wielu u»ytkowników mo»e pracowa¢ jedno- dów programistycznych o charakterze algoryt- cze±nie, dlatego ka»dy u»ytkownik posiada swój micznym (ACM, MPPZ, MWPZ itp.). Opisuje katalog domowy, który jest miejscem przecho- on podstawy obsªugi Linuksa oraz sposoby na wywania wszystkich plików zwi¡zanych z da- wydajne rozwi¡zywanie zada« olimpijskich przy nym u»ytkownikiem (dokumenty, pliki kongu- pomocy standardowych narz¦dzi. racyjne, e-maile itp.). 2 mo»esz dodatkowo dostosowa¢ do swoich po- Je±li do kodowania wybraªe± tryb graczny, Czytanie i analiza zadania trzeb ustawienia terminala (wielko±¢ czcionki, ukªad kolorów). W trybie tekstowym masz do- Przeczytaj uwa»nie zadanie. Zaprojektuj algo- st¦pnych kilka wirtualnych konsol, mi¦dzy któ- rytm i struktury danych. Opcjonalnie sporz¡d¹ rymi mo»na przeª¡cza¢ si¦ przy pomocy kombi- notatki na papierze. Najlepiej nie zabiera¢ si¦ za nacji Alt-F1, Alt-F2, itd. kodowanie, dopóki nie ma si¦ w gªowie peªnego obrazu rozwi¡zania. Podczas kodowania trzeba qsort). nie wymy±laniu algorytmu. Po otworzeniu terminala aktualny katalog roboczy b¦dzie ustawiony na twój katalog do- Kodowanie mowy. $ cd trybu gracznego do tekstowego: Ctrl-Alt-F1) xterma lub Sprawdzanie aktualnego katalogu roboczego od- Konsol¦). bywa si¦ przy pomocy polecenia Na komputerach udost¦pnianych zawodnizasilania, domy±lnie uruchamia si¦ Linuks w trybie gracznym oraz menad»er okien KDE. W Aby wypisa¢ zawarto±¢ katalogu trzeba u»y¢: trybie gracznym zarz¡dzanym przez KDE pro- $ ls gramy okienkowe mo»na wybiera¢ z menu rozwijanego przyciskiem K umiejscowionym w le- Je±li chcemy dodatkowo wypisa¢ rozmiary pli- wym dolnym rogu ekranu, który peªni rol¦ podobn¡ jak przycisk Start w Windows. kconsole, ków sformatowane w postaci bardziej czytel- Aby nej dla czªowieka, nale»y u»y¢ polecenia rozwijamy gªówne menu opcjami klikaj¡c w przycisk K, nast¦pnie rozwijamy podmenu System i w ko«cu wybieramy Pro- -l oraz -h: ls z $ ls -lh gram Terminala (Konsola). Obok przycisku K znajduj¡ si¦ tak»e inne przydatne przyciski. pwd: $ pwd /home/contest kom Olimpiady Informatycznej, po wª¡czeniu uruchomi¢ Do katalogu domowego mo»na szybko wróci¢ przy pomocy polecenia: Zaloguj si¦ na konsol¦ tekstow¡ (przej±cie z lub otwórz terminal graczny (np. man kªadowo dokumentacj¦ jakiej± funkcji (np. si¦ koncentrowa¢ na poprawno±ci programu, a 3 Na jednej konsoli mo»na mie¢ otwarty program, a na innej przy- Szczegóªowe opisy wszystkich polece« Linukso- Jednym z nich jest przy- wych mo»na uzyska¢ przy pomocy polecenia cisk Pliki osobiste, który sªu»y do przegl¡da- w nast¦puj¡cy sposób: 1 man $ man ls administracji systemu, ni» na Olimpiadzie Informatycznej Po wywoªaniu opisu polecenia, nawigacja odbywa si¦ przy pomocy strzaªek oraz przycisków PgUp i PgDown. • Wychodzi si¦ przez naci- emacs jeszcze bardziej rozbudowany ni» vim, ale troch¦ bardziej intuicyjny, te» ±ni¦cie q. Wyszukiwanie tekstu jest mo»liwe po wymaga nauki z podr¦cznika, wspomaga naci±ni¦ciu / (dziaªa te» w wielu innych pro- debugowanie gramach m.in. w Firefox). Je±li po znalezieniu • wzorca chcemy znale¹¢ kolejne jego wyst¡pienie kwrite, kate standardowe edytory w Czasami bardziej szczegó- ±rodowisku gracznym KDE, intuicyjne ªowe informacje mo»na uzyska¢ dzi¦ki poleceniu oraz zawieraj¡ce du»o opcji dost¦pnych trzeba, nacisn¡¢ n. info: przez menu, polecane w trybie gracznym $ info ls jako alternatywa dla mcedit Zaczynamy edycj¦ nowego pliku przy pomocy Zalecane jest zapoznanie si¦ z mo»liwo±ciami podstawowych polece« (info coreutils). polecenia: Utwórz podkatalog w którym b¦dziesz trzy- $ mcedit zad1.cpp maª wszystkie pliki (¹ródªa, testy) dotycz¡ce aktualnie rozwi¡zywanego zadania i przejd¹ do nowo utworzonego katalogu: 4 $ mkdir zad1 $ cd zad1 Po zapisaniu programu i wyj±ciu z edytora przyst¦pujemy do kompilacji: Bardzo po»yteczna funkcja linii polece« jest au- $ c++ zad1.cpp tomatyczne dopeªnianie. Je±li wpiszemy polecenie, którego argumentem jest nazwa pliku lub Je±li kompilacja nie powiodªa si¦, analizujemy katalogu, to cz¦sto argumentu nie trzeba wpisy- wypisane przez kompilator informacje o bª¦dach wa¢ do ko«ca. Wystarczy wpisa¢ jego pierwsze i wracamy do edytora aby poprawi¢ program. litery, a potem nacisn¡¢ Tab. Je±li jest tylko je- W przeciwnym wypadku powstanie plik wyko- den plik lub katalog, którego nazwa zaczyna si¦ nywalny od podanych znaków, argument zostanie od razu ranowany sposób: mo»liwo±ci, zostan¡ one wypisane na ekranie i $ c++ -Wall -Wshadow -o zad1 zad1.cpp trzeba wtedy poda¢ kolejne znaki argumentu. Wi¦cej informacji o interpreterze linii polece« Opcja man bash. Rozpocznij edycj¦ pliku z rozwi¡zaniem. Do wª¡cza dodatkowe ostrze»enia po- natomiast opcja -Wshadow nakazuje kompilato- rowi wykrywanie przypadków przykrycia w pro- skªadni. Najcz¦±ciej u»ywane edytory to: gramie jednych zmiennych przez inne zmienne o mcedit intuicyjny, obsªuga jak w edy- tej samej nazwie. Opcja torach u»ywanych pod Windows, mo»na -o ustawia nazw¦ pliku wykonywalnego. u»ywa¢ bez wiedzy wst¦pnej, poniewa» za- Je±li chcemy skompilowa¢ program z dodat- wsze wy±wietla na ekranie informacje na kowymi optymalizacjami kodu maszynowego, temat swoich funkcji i skrótów klawiszo- mo»na u»y¢ polecenia: wych, zupeªnie wystarczaj¡cy na Olimpia- $ c++ -Wall -Wshadow -O2 \ -fomit-frame-pointer -o zad1 zad1.cpp dzie Informatycznej • -Wall magaj¡ce wykrywa¢ bª¦dy na etapie kompilacji, edycji najlepiej u»ywa¢ edytora z kolorowaniem • a.out. Mo»na skompilowa¢ program w bardziej wy- dopeªniony do tej wªa±nie nazwy! Je±li jest kilka mo»na uzyska¢ po wywoªaniu Kompilacja vim nieintuicyjny interfejs, obsªugi trzeba uczy¢ si¦ z instrukcji i ¢wiczy¢ kilka Je±li chcemy podzieli¢ dªugie polecenie na kilka dni zanim nabierze si¦ wprawy, umo»liwia linii to umieszczamy znak wykonanie skomplikowanych operacji przy nii, oprócz ostatniej. \ na ko«cu ka»dej li- pomocy kilku przyci±ni¦¢ klawiatury, bar- W tym miejscu warto powiedzie¢, »e ko- dzo du»o opcji, wbudowany j¦zyk skryp- lejnym udogodnieniem Linuksowej linii polece« towy, jego zalety doceni¢ mo»na raczej do- jest mo»liwo±¢ szybkiego przywoªania wcze±niej piero przy pisaniu du»ej ilo±ci programów i wykonanych polece« przy pomocy wciskania na 2 klawiaturze strzaªki w gór¦. Przywoªane pole- Taki sam efekt jaki daje ostatnie polecenie, cenie mo»na przed u»yciem dodatkowo zmody- mo»na uzyska¢ przy pomocy mechanizmu wzor- kowa¢. ców: 5 $ ls *x* | wc -l Testowanie Je±li w argumencie u»yjemy znaku zad1 Skompilowany plik wykonywalny *, to jest on rozwijany do listy plików w aktualnym katalogu, urucha- których nazw¦ da si¦ uzyska¢ przez zast¡pienie mia si¦ w nast¦puj¡cy sposób: ka»dej * we wzorcu przez pewien ci¡g znaków. Mo»na tak»e uruchomi¢ program podaj¡c $ ./zad1 mu na wej±ciu zawarto±¢ jakiego± pliku: $ cat in | ./zad1 Je±li nasz program próbuje co± czyta¢ ze standardowego wej±cia, zatrzyma si¦ w oczekiwaniu Jeszcze krócej mo»na to zrobi¢ w taki sposób: na dane zaraz po uruchomieniu. Mo»na wtedy $ ./zad1 < in po prostu r¦cznie wpisa¢ odpowiednie dane. Koniec pliku uzyskuje si¦ przez naci±ni¦cie Ctrl-D. Taki zapis powoduje, »e nie s¡ uruchamiane Gdy chcemy bezzwªocznie zako«czy¢ aktual- »adne dodatkowe programy i standardowe wej- nie wykonywany program, u»ywamy kombinacji ±cie naszego programu jest poª¡czone bezpo±red- Ctrl-C. Je±li proces wyª¡czyª mo»liwo±¢ zako«- nio z danym plikiem. czenia w taki sposób, trzeba uzyska¢ dost¦p do Wiemy ju» du»o o sterowaniu wej±ciem, ale innego terminala, znale¹¢ numer procesu przy pomocy polecenia ps lub ps aux nie zajmowali±my si¦ do tej pory wyj±ciem pro- (druga wersja gramu. Normalnie program wypisuje wszystkie daje wi¦cej informacji) i zako«czy¢ proces pole- dane na ekran. Je±li wypisaª wi¦cej linii ni» po- ceniem: siada nasz terminal, dane, które zd¡»yªy uciec $ kill -9 numer_procesu przez górn¡ kraw¦d¹ terminala, mo»na dzi¦ki Najcz¦±ciej mo»na zako«czy¢ proces du»o pro- dane wypisywane przez program do pliku (w ±ciej: naszym przypadku do kombinacji Shift-PgUp. aby móc si¦ im do- przetwarza¢: $ ./zad1 < in > out To zako«czy wszystkie procesu u»ytkownika, których pliki binarne miaªy nazw¦ mc (mc - Je±li nie chcemy kasowa¢ zawarto±ci pliku Midnight Commander to bardzo intuicyjny, najNatomiast polecenie out tylko dopisa¢ dane na ko«cu, musimy u»y¢ in- cz¦±ciej u»ywany tekstowy menad»er plików w nego operatora przekierowania wyj±cia: killall mc $ ./zad1 < in >> out jest równowa»ne z prób¡ zako«czenia wszystkich procesów u»ytkownika o nazwie out), kªadniej przyjrze¢ w edytorze i ewentualnie dalej $ killall -9 mc Linuksie). Mo»emy te» zapisa¢ mc przy pomocy Mo»na te» zapisa¢ dodatkowo do pliku standar- kombinacji Ctrl-C. dowe wyj±cie diagnostyczne programu (stderr): Je±li dane dla naszego programu zajmuj¡ tylko jedn¡ linijk¦, mo»na je poda¢ tak»e w taki $ ./zad1 < in > out 2> err sposób: Je±li chcemy mierzy¢ wydajno±¢ programu, na $ echo "1 2 3 4" | ./zad1 pewno wa»na jest mo»liwo±¢ mierzenia czasu U»yªem tu jednej z najprzydatniejszych funk- $ time ./zad1 < in > out jego wykonania: cji linii polece«, czyli potoków. Je±li napiszemy kilka polece« oddzielonych znakami | Po to stan- dardowe wyj±cie pierwszego polecenia zostanie szych danych. poª¡czone ze standardowym wej±ciem drugiego polecenia itd. Czyli je±li chcemy np. maªych testów poprawno±cio- Przydaj¡ si¦ wtedy ró»ne gene- ratory testów. policzy¢ ile jest w aktualnym katalogu plików z liter¡ wykonaniu wych warto te» przetestowa¢ program na wi¦k- x Podczas testowania, szczególnie kiedy powstaj¡ du»e pliki wynikowe, czasami pojawia si¦ w nazwie, piszemy: konieczno±¢ porównania dwóch plików. Mo»na $ ls | grep x | wc -l to zrobi¢ przy pomocy polecenia 3 cmp: $ cmp plik1 plik2 $ c++ -g -o zad1 zad1.cpp Je±li chcemy dosta¢ dokªadniejsze dane o tym, Przy pomocy w których miejscach pliki ró»ni¡ si¦, lepiej jest gdb mo»na te» debugowa¢ odpo- wiednio skompilowane programy w Pascalu: u»y¢: $ diff plik1 plik2 $ fpc -g zad1.pas Je±li podczas testowania okazaªo si¦, »e pro- gdb i ªadujemy nasz plik binarny: Uruchamiamy gram nie dziaªa zgodnie z naszymi oczekiwaniami, trzeba jak najszybciej znale¹¢ i poprawi¢ $ gdb zad1 bª¡d. S¡ dwie szkoªy debugowania. Pierwsza metoda nie potrzebuje debugera i Po uruchomieniu polega modykowaniu programu w celu znale- gdb znajdziemy si¦ w linii po- lece« debugera. Mo»emy od razu przegl¡da¢ kod zienia bª¦dów, a dokªadniej, dodawaniu instruk- programu przy pomocy polecenia cji które sprawdzaj¡ poprawno±¢ oblicze« i spój- skrócie no±¢ struktur danych oraz wypisuj¡ dodatkowe l. list lub w Je±li chcemy zobaczy¢ fragment pro- gramu otaczaj¡cy wybran¡ lini¦ wystarczy wpi- informacje o tym co dzieje si¦ w trakcie oblicze«. sa¢: Mo»na np. doda¢ instrukcje, które b¦d¡ wypisywa¢ stan wybranych zmiennych, w wybra- (gdb) l N nych momentach wykonania programu: int a[3][3],x; (...) printf("x=%d\n",x); for (int i=0;i<3;i++) { for (int j=0;j<3;j++) printf("%3d",a[i][j]); printf("\n"); } program wykona si¦ do ko«ca zatrzymuj¡c si¦ Mo»na te» doda¢ kod, który b¦dzie testowaª, czy tylko w oczekiwaniu na dane. Przy uruchamia- zmienne i struktury danych speªniaj¡ okre±lone niu mo»na od razu przekierowa¢ zawarto±¢ do- warunki i wypisywaª komunikaty je±li co± idzie wolnego pliku na standardowe wej±cie naszego nie tak: programu: gdzie te» to assert.h: zrobi¢ z u»yciem Mo»emy tak»e (gdb) l nazwa_funkcji Aby wystartowa¢ nasz program, trzeba u»y¢ polecenia if (x<0) { printf("bª¡d: x=%d\n",x); exit(1); } Mo»na N to numer linii programu. wy±wietli¢ tre±¢ dowolnej funkcji: run (lub r). Bez dodatkowych ustawie« (gdb) r < in Je±li chcemy mie¢ mo»liwo±¢ wykonywania programu linijka po linijce, konieczne jest ustawienie tzw. punktów zatrzymania (breakpoint ). biblioteki Aby ustawi¢ punkt zatrzymania trzeba u»y¢ polecenia #include <assert.h> (...) assert(x>=0); break lub w skrócie b: (gdb) b N W tym przypadku, je±li warunek nie zosta- Mo»na ustawi¢ kilka punktów zatrzymania, nie nie speªniony, program zatrzyma si¦ i wypisze tylko zwi¡zanych z konkretnych liniami pro- numer linijki w której asercja nie zostaªa speª- gramu, niona. funkcji: Druga metoda debugowania wymaga u»ycia debugera. (gdb) b moja_funkcja Standardowym debugerem pod Li- nuksem jest gdb. Je±li zamierzamy u»ywa¢ ale tak»e z wywoªaniami wybranych gdb, kod binarny naszego programu musi zawiera¢ Je±li chcemy zatrzyma¢ nasz program od razu dodatkowe informacje. Odpowiedni kod binarny po uruchomieniu, piszemy: uzyskuje si¦ przez przekompilowanie programu z opcj¡ -g: (gdb) b main 4 To samo dotyczy programów w Pascalu. W Po ustawieniu punktów zatrzymania, uru- Makefile mo»na doda¢ te» funkcje odpo- wiedzialne za testowanie: chamiamy nasz program i czekamy na jego zatrzymania, na ekranie zostanie wy±wietlona li- t: zad1 time ./zad1 < in | tee out nia, która ma by¢ za chwil¦ wykonana. Aby j¡ Teraz mo»emy wywoªa¢ polecenie: trzymanie. Je±li zatrzymaª si¦ na punkcie za- wykona¢ i przej±¢ do kolejnej linii, u»ywamy po- next lecenia (albo n). $ make t Aby powtórzy¢ ostatnio wykonane polecenie nie musimy go wpisywa¢. Wystarczy wcisn¡¢ Enter. Wywoªanie takiego polecenia uaktualnia w razie Debuger powtórzy potrzeby kod binarny naszego programu, a po- wtedy ostatnio u»yte polecenie. tem wykonuje go podaj¡c na wej±ciu zawarto±¢ W celu kontynuacji do kolejnego punktu zatrzymania, u»ywamy polecenia c). continue pliku (lub out step s). (lub preterze linii polece« u»y¢ polecenia zautomatyzowa¢ bash. Po napisaniu po- kie pliki w aktualnym katalogu roboczym, których nazwy ko«cz¡ si¦ znakami da¢ aktualne warto±ci zmiennych, w tym tablic print tak»e ni»szego polecenia zostan¡ znalezione wszyst- W trybie pracy krok po kroku mo»na ogl¡i napisów. mo»na wykorzystuj¡c elementy programowania inter- ªanie funkcji i chcemy prze±ledzi¢ dokªadnie to next i zapisuj¡c wyj±cie programu do pliku Testowanie Gdy w linii, która ma si¦ wykona¢ jest wywowywoªanie, trzeba zamiast in oraz na ekran. .in. Nast¦pnie nasz program zostanie wykonany kilka razy, za Robi si¦ to przy pomocy polecenia ka»dym razem dostaj¡c na wej±ciu kolejny plik. (lub p): Wyniki wykona« programu znajd¡ si¦ w plikach (gdb) p x o nazwach takich jakie miaªy pliki wej±ciowe, tylko z rozszerzeniami zmienionymi z Dodatkowo mo»na ustawia¢ punkty obserwa- .out: .in na cyjne (watchpoint ), przy pomocy polecenia watch (lub w). Powoduj¡ one wypisanie stosow- $ for f in *.in; do \ nej informacji przy ka»dej zmianie obserwowa- ./zad1 < $f > `basename $f .in`.out \ || echo "Bª¡d: $f"; done nej zmiennej. Da si¦ nawet zmienia¢ warto±ci zmiennych i wywoªywa¢ funkcje (polecenia set Wi¦ksze polecenia warto zapisa¢ sobie w plikach i call)! (skryptach): Wi¦cej informacji o mo»liwo±ciach gdb mo»na uzyska¢ po wej±ciu do tego programu i #!/bin/bash wpisaniu polecenia help. for f in *.in do ./zad1 < $f > `basename $f .in`.out \ 6 Automatyzacja pracy || echo "Bª¡d: $f" done W pierwszej kolejno±ci warto usprawni¢ kompilacj¦. Podstawowa metoda polega na utworze- Po utworzeniu skryptu trzeba mu jeszcze nada¢ niu odpowiedniego pliku uprawnienie do wykonania: Makefile: all: zad1 zad1: zad1.cpp c++ -g -Wall -Wshadow \ -o zad1 zad1.cpp $ chmod +x testy Tak przygotowany skrypt jest gotowy do u»ycia: $ ./testy Stworzony plik jest u»ywany przez program make, W skryptach mo»na te» u»ywa¢ p¦tli w stylu który sªu»y do automatyzacji procesu j¦zyka C: kompilacji. Wystarczy teraz wpisa¢: #!/bin/bash for ((i=0;i<10;i++)) do echo $i | ./zad1 done $ make Program make sprawdzi, czy kod binarny jest aktualny w stosunku do kodu ¹ródªowego. Je±li nie jest aktualny, przekompiluje program. 5 bc. Linuksowej linii polece« mo»na tak»e u»ywa¢ ±ciach. jako prostego kalkulatora: zwala on na obliczenia na liczbach caªkowitych o Chodzi mianowicie o program Po- dziesi¡tkach tysi¦cy cyfr oraz konwersj¦ mi¦dzy $ echo $((2+(3*7))) 23 systemami liczbowymi o ró»nych podstawach. Oto przykªadowe u»ycie bc: $ echo "2^100" | bc 1267650600228229401496703205376 W wi¦kszo±ci dystrybucji Linuksa standardowo jest dost¦pny kalkulator o sporych mo»liwo- 6