En liten introduktion till # # # # ### # # # # ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ## # # # ##### # # ### # # Allmänt Materialet är hämtat från böcker, tidningar och från en UNIX-kurs som gavs i datorföreningen Lysator's (i Linköping) regi under våren 1987 av Lars Aronsson. I texten kommer jag att skriva vänsterhakar (">") för att indikera utseende på skärmen i mina exempel. Jag använder mig dessutom av Bourne-shell i mina exempel ("sh"). Datorn jag använder är en ABC1600 med en variant av UNIX som kallas ABCenix. När det gäller UNIX-litteratur så finns det idag en hel uppsjö med böcker av olika kvalitet, och det är svårt att välja den rätta boken att lära sig UNIX med. Att lära sig UNIX förutsätter att man framförallt har en god portion tålamod, det är inte så lätt som det kanske ser ut, och det tar en del tid. Dessutom krävs det att man sätter sig och tillämpar det man lärt sig i teorin. Det är karakteristiskt för UNIX att det tar tid att lära sig grunderna, men när man väl gjort det så upptäcker man den kreativa miljön som inte finns någon annanstans. Slutligen ett stort tack till dem som på olika sätt hjälpt till med denna text. Lycka till! Johan Persson, medlem 2397 i ABC-klubben (2397@msg.abc.se) medlem 430 i Lysator (jp@lysator.liu.se) Historien bakom operativsystemet UNIX Unix har sina anor från 1960-talet, närmare bestämt från ett annat operativ- system vid namn Multics som hade utvecklats vid M.I.T. År 1969 skriver Ken Thompson ett enanvändaroperativsystem som han kallar Unics till en PDP-7. Dennis M. Ritchie blir intresserad och ansluter sig. År 1971 flyttas UNIX till PDP-11, och året därpå kommer The UNIX Programmer's Manual (även kallad UPM), 2nd edition. År 1973 skriver Dennis M. Ritchie den första C-kompilatorn på PDP-11, Dennis M. Ritchie och Ken Thompson skriver då om UNIX-kärnan i C. År 1975 börjar UNIX 6th edition bli populär på universiteten, den blir sedan också den första att lanseras kommersiellt. År 1978 kommer UNIX 7th edition, den bildar grunden till de UNIX-varianter som finns ute idag (t.ex. 4.3BSD, System5.3, Ultrix, Linux, 386BSD, SCO-Unix, MACH och Minix). UNIX från första början Det första man får lära sig under UNIX är att för att få tillgång till datorn så måste man starta en session, det kallas att "logga in". Man kan då se följande text på skärmen: > > elena login: > Datorn förväntar sig nu att man anger sin användar-identitet, skriver man då in t.ex. "jp" (var noggrann, man kan troligen inte sudda ut fel!) som svar ser man följande: > > elena login: jp > password: > Datorn begär nu ett lösenord (kallat "password"), skriv nu in "jpdemo" (notera att nu ekas inte texten). Nu ser man följande på skärmen: > > elena login: jp > password: > > elena - ABCenix ver 5.18 Virtual, Window version > > $ > Datorn har nu accepterat lösenordet och är redo att acceptera kommandon. När man sedan vill avsluta sessionen ("logga ut") trycker man på Control-D (håll ned tangenten märkt "CTRL" och tryck på "D"): > > $ > > elena login: > Kommandon I UNIX finns det många kommandon, och en hel del av dem har ganska kryptiska namn, vem skulle t.ex. gissa att kommandot för att lista filer heter "ls" ? Dessutom brukar de flesta kommandon ta parametrar. Nu är det faktiskt inte så farligt som det låter, det finns en manual tillgänglig on-line som kan förklara en del, det rekommenderas att man använder den flitigt, framför allt i början. I UNIX skriver man sina kommandon till en shell. Shellen är ett program vars uppgift är att läsa in kommandon och exekvera dem. Ett kommando i shellen består av ett kommando (första ordet man skriver in) och eventuella argument till kommandot (resten av raden). Antag t.ex. att man vill exekvera kommandot "echo" (som ekar sina argument) och ge argumenten "Hello world" till det: > > $ echo Hello world > Hello world > $ > Shellen har som sin prompt tecknet "$". Man bör iaktta en viss försiktighet när man använder kommandon i UNIX, slå hellre upp i manualen innan! Under UNIX finns det t.ex. ingen möjlighet att återfå filer som blivit raderade genom oförsiktighet. Det finns speciellt några grundläggande kommandon som kan vara bra att bekanta sig med (kika i manualen hur de används först (vilket man gör med kommandot "man kommando" om kommandot man undrar över heter "kommando")), och de är: Namn Exempel Kort förklaring ---------------------------------------------------------------------- banner eka argumentet på skärmen i stort format bc liten kalkylator med "normal" notation cd byt directory (kommando i shellen!) cat skriv ut innehållet i en fil på skärmen chmod ändra skyddskod på filer cmp jämför filer cp kopiera filer date visa dagens datum och tid dc liten kalkylator med RPN-notation df visa diskutrymme på anslutna diskar diff visa skillnader mellan filer du visa använt diskutrymme echo eka argumenten på skärmen find sök efter filnamn grep sök efter text i filer head visa första raderna i fil(er) id visa användar-identitet och grupp-identitet kill skicka signaler till processer ln skapa länkar mellan filer (användbart!) login logga in som ny användare lpr skriv ut filer på skrivare ls lista filer mail skriv brev till användare man titta i manualen mesg tillåt eller vägra dialoger mkdir skapa directories more som "cat", men sidvis på skärmen mv byt namn på, eller flytta fil(er) (eller directories) passwd byt lösenord ps visa aktiva processer pwd skriv ut aktuellt directory rm ta bort filer rmdir ta bort directories set visa variablers värde i shellen sort sortera text stty ändra eller visa terminalparametrar tail visa sista raderna i fil(er) tee kan användas för att kopiera utskrift från ett program till fil samtidigt som det kommer på skärmen umask visa eller ändra mask för skapande av filer (manualen) uniq visa unika delar av text wc räkna ord, tecken och rader who visa vilka användare som är inloggade write starta dialog med användare Andra program som brukar följa med UNIX-installationen är en del spel: arithmetic ching fish hangman quiz words backgammon fortune wump Prova gärna! Att slå i manualen gör man med kommandot "man", för att få reda på hur kommandot "date" fungerar skriver man "man date" till shellen. Filsystemet Under UNIX lagrar man information i filer. Filerna formar en trädliknande struktur. Alla filer har namn och ett tilldelat lagringsutrymme på en disk. Längden på namnet varierar mellan olika implementationer av UNIX men brukar få vara minst 14 tecken långa. Det finns olika typer av filer, lite förenklat sett så finns det två typer av filer, directories (innehållsförteckning över filer) och (vanliga) filer. Trädstrukturen har en root som brukar kallas "root" (filnamnet på root-directoriet är "/"). Några exempel på de filer som brukar finnas på "root" är följande: / ! +-------+-------+-------+---------------+ ! ! ! ! ! bin/ dev/ etc/ tmp/ usr/ ! ! ! ! ! cat mem motd sort01234 bin/ ! ! ! ! who null passwd games/ ! ! ! wc tty spool/ Alla directory-namn avslutas med "/". För att beskriva var i trädet filer ligger räcker det med att ange dess namn. Filen "mem" i directoriet "dev" adresseras som "/dev/mem". Den typen av adressering kallas absolut adressering. Ett alternativ är relativ adressering som innebär att man utgår från det directory där man befinner sig och anger vägen till filen därifrån. Principen är att absolut adressering alltid utgår från root-directoriet ("/"), och relativ adressering utgår från det directory där man befinner sig, även kallat aktuellt directory (något man kan ta reda på med kommandot "pwd"). Det finns två filer som har underliga namn, det är "." (aktuellt directory) och ".." (directoryt ovanför aktuellt directory i trädstrukturen). Att gå upp en nivå i trädstrukturen kan man göra med kommandot "cd ..". Exempel: den absoluta adresseringen "/usr/games/lib/fortunes" kan adresseras som "lib/fortunes" om man befinner sig i (har som sitt aktuella directory) directoryt "/usr/games". Notera att man sätter snedstreck ("/") mellan directory-namnen. Filtyper Det finns flera olika slags filer i UNIX. Textfiler innehåller läsbar text, binärfiler innehåller binära data (oläsbart format), exekverbara filer (som ju också är binärfiler) samt specialfiler (device-filer, som skrivare och terminaler). Exempel på textfiler är "/etc/passwd". Exempel på binärfiler är vilken exekverbar fil som helst (t.ex. "/etc/mount"). Exempel på specialfiler är de flesta filerna i directoriet "/dev", t.ex. "/dev/tty". En specialfil som man använder sig ofta av är "/dev/null", mer om det senare. Man använder sig ofta av extension för att markera filtyp, men det är inte allmängiltigt (kom ihåg att man inte behöver använda sig av extension om man inte vill). fil.c C-program fil.p Pascal-program fil.f Fortran-program fil.s Assembler-program fil.o Objekt-program fil Exekverbar fil Filskydd I UNIX har varje fil en skyddskod som avgör vem som kan göra vad med den. Skyddskoden för filer visas t.ex. när man exekverar kommandot "ls -l". > > $ ls -l > total 46 > drwxr-xr-x 2 jp 128 Apr 4 09:35 disc > drwxr-xr-x 2 jp 784 Apr 20 09:35 etc > drwxr-xr-x 5 jp 464 Apr 22 19:27 tmp > -rw-r--r-- 1 jp 21241 Apr 22 19:24 unix > $ > Skyddskoden består av 4 delar och är (listad på skärmen) 10 tecken lång. I första tecknet betyder '-' att det är en vanlig fil ('d' betyder att det är ett directory). De resterande tecknen anger rättigheterna för olika användare vid access av filen. Rättigheterna tar vardera upp tre tecken. I följd är det användarens (ägaren av filen), gruppens och övrigas rättigheter. Användarens egna rättigheter berör bara den som skapat filen (eller rättare sagt, den nuvarande ägaren till filen), vars namn syns senare på raden ("jp"). Gruppens rättigheter berör alla som är medlemmar i den grupp (har samma grupp- id) som äger filen. Slutligen har man rättigheterna för övriga (ALLA andra andra användare i systemet). Rättigheterna består av tre bokstäver som har följande betydelse: '-': rättigheten är inte giltig. 'r': Läsrättighet, man har rätt att läsa filen. 'w': Skrivrättighet, man har rätt att skriva till filen. 'x': Exekveringsrättighet, man har rätt att exekvera filen. Var och en av möjligheterna kan slås av eller på individuellt. Det finns fler möjligheter vad beträffar rättigheterna som vi för närvarande hoppar över. Ibland händer det att man anger rättigheterna som ett tal (oktalt), det är helt enkelt så att man kan representera rättigheterna på bägge sätten, inget sätt är mer rätt än det andra. Det oktala talet består av tre siffror (man kan ibland använda fyra siffror, men det går vi inte in på nu), som representerar, i tur och ordning, använd- arens, gruppens och övrigas rättigheter. Man räknar med att ett 'r' är värt 4, ett 'w' är värt 2 och ett 'x' är värt 1. För "rwx" ger det då 7. Skyddskoder kan man modifiera med kommandot "chmod". I exemplet ovan har filen "unix" skyddskoden "-rw-r--r--", oktalt blir det (rw- = 6, r-- = 4) skyddskoden 644. Några exempel på användningen av "chmod": > > $ ls -l unix > -rw-r--r-- 1 jp 24308 Apr 30 19:51 unix > $ chmod o-r unix > $ ls -l unix > -rw-r----- 1 jp 24308 Apr 30 19:51 unix > $ chmod g=rw unix > $ ls -l unix > -rw-rw---- 1 jp 24308 Apr 30 19:51 unix > $ chmod u=rw,g=r,o=r unix > $ ls -l unix > -rw-r--r-- 1 jp 24308 Apr 30 19:51 unix > $ chmod 600 unix > $ ls -l unix > -rw------- 1 jp 24308 Apr 30 19:51 unix > $ chmod a+wr unix > $ ls -l unix > -rw-rw-rw- 1 jp 24308 Apr 30 19:51 unix > $ chmod 644 unix > $ ls -l unix > -rw-r--r-- 1 jp 24308 Apr 30 19:51 unix > $ > För utförligare förklaringar av kommandot "chmod", se manualen. Inom UNIX pratar man om användar-id och rättigheter. Användar-id är ett unikt id som identifierar dig som användare, det är ett nummer (heltal) som dock oftast också identifieras med ett namn (det är det namnet man "loggar in" som (i vårt fall är det "jp")). I UNIX-nomenklaturen kallas detta nummer för user- id (uid). Dessutom är alla användare (vare sig de vill det eller inte) medlemmar i en grupp (samling av användare), detta id kallas grupp-id, vilket i UNIX-nomenklaturen kallas group-id (gid). Man kan använda UNIX-kommandot "id" för att undersöka sina identiteter: > > $ id > uid=40(jp) gid=1(other) > $ > Mitt eget användar-id är alltså 40 (användarnamnet är "jp"), och mitt grupp-id är 1 (gruppens namn är "other"). Matchning av filnamn i shellen Man kan i UNIX matcha flera filer med s.k. jokertecken i shellen. De joker- tecken som kan användas är: '*': Matchar allt (inget eller flera tecken). '?': Matchar ett (1) tecken. Dessutom kan man ange urval på vissa speciella tecken: "[unix]*" matchar alla filer som börjar på 'u', 'n', 'i' eller 'x'. "[a-e]*" matchar alla filer som börjar på något tecken i intervallet 'a' .. 'e'. "[^ps]*" matchar alla filer som INTE börjar på 'p' eller 's'. Glöm inte att det i UNIX är skillnad på små och stora bokstäver. Dessutom kan man normalt sett inte använda de svenska tecknen }{|][\ i filnamn. Några exempel på användningen av fil-matchning: > > $ wc [ad]*.[cp] > ..... > $ > Räkna ord, tecken och rader på de filer som börjar på 'a' eller 'd' och har extensionen '.c' (C-fil) eller '.p' (Pascal-fil). > > $ ls a* > ..... > $ > Lista de filer som börjar på 'a'. Shellen i UNIX Den shell man kör under UNIX har mer möjligheter än vad som syns vid första anblicken, man har stora möjligheter att programmera den att utföra olika konster. Bl.a. så har man följande möjligheter: I nedanstående exempel skriver alla kommandon normalt sett sina resultat till skärmen, och tar indata från tangentbordet. > > $ kommando utfil > Kommandot "kommando" tar filen indata från filen "infil" och skriver sina resultat till filen "utfil". > > $ kommando >>utfil > Kommandot "kommando" skriver sina resultat i slutet på filen "utfil". > > $ date > Wed Apr 22 20:19:08 MET 1992 > $ date >datum > $ cat datum > Wed Apr 22 20:19:18 MET 1992 > $ date >>datum > $ cat datum > Wed Apr 22 20:19:18 MET 1992 > Wed Apr 22 20:19:44 MET 1992 > $ wc < datum > 2 12 58 > $ > Ibland är man inte intresserad av att se resultatet av ett kommando: > > $ time date >/dev/null > > real 1.1 > user 0.0 > sys 0.1 > $ > Genom att använda sig av utfilen "/dev/null" försvinner alla utdata. > > $ kommando1 | kommando2 > Kommandot "kommando2" läser som infil resultaten från "kommando1". Detta är en pipe (efter pipeline (engelska för "rör")), en samman- koppling av två skilda kommandon. Som exempel på användning kan man tänka sig att "kommando1" är ett statistik-program som producerar resultatet i siffer-form, och "kommando2" är ett program som tar de siffrorna och producerar en graf som sedan kan användas vid en presentation. > > $ ls -l > total 47 > drwxr-xr-x 2 jp 128 Apr 4 09:35 disc/ > drwxr-xr-x 2 jp 784 Apr 20 09:35 etc/ > drwxr-xr-x 5 jp 464 Apr 22 19:27 tmp/ > -rw-r--r-- 1 jp 21611 Apr 22 20:00 unix > $ ls -l | wc > 5 34 199 > $ > Utskriften av "wc" anger här att utmatningen från "ls -l"-kommandot utgjordes av 5 rader, 34 ord och 199 tecken. > > $ kommando1 && kommando2 > Kommandot "kommando2" körs endast om "kommando1" körs utan fel. > > $ kommando1 || kommando2 > Kommandot "kommando2" körs endast om "kommando1" misslyckas. > > $ kommando1 ; kommando2 > Sekvens, kör först "kommando1", sedan "kommando2". > > $ kommando & > Kör kommandot "kommando" som "bakgrundsjobb" (pröva!) Sedan finns en hel del andra möjligheter, för att se dessa rekommenderas att man tittar i manualen ("man sh"). En sak som måste nämnas är betydelsen av vissa (viktiga) variabler i shellen (som man kan se med kommandot "set"): HOME definierar ditt hemdirectory. PATH definierar sökvägar till kommandon. MAIL definierar namn på filen där din email samlas. TERM definierar den terminaltyp man använder sig av. För att få se värdet på en variabel med namnet "var" ger man kommandot "echo $var" (alla variabler kan man se med kommandot "set"). Variabeln "HOME" behöver man inte sätta till något speciellt, det brukar vara uppsatt till rätt värde vid inloggningen, samma sak gäller variabeln "MAIL". Användningen av "HOME" kan t.ex. vara att ge en möjlighet att se vilka filer man har på sitt hem-directory oberoende av var i filsystemet man befinner sig. > > $ ls > proj > $ cd /tmp > $ ls > sort01234 > $ ls $HOME > proj > $ > "MAIL" är en variabel som mail-programmet använder sig av för att leta upp din brevlåda för elektronisk post (email). "PATH" är en variabel som man själv ska påverka, den styr vilka kommandon man kan ge genom att definiera var i filsystemet datorn ska leta efter motsvarande program. > > $ echo $PATH > /bin:/usr/bin:. > $ wump > wump: not found > $ PATH=$PATH:/usr/games > $ wump > ............... > I variabeln ligger alla sökdirectories efter varandra, separerade med ett kolon (":"). Sökning efter kommandon sker i den ordning directories ligger i "PATH". I exemplet ovan ser man att datorn först inte hittar "wump" (ett spel som finns i directoryt "/usr/games"), efter att man lagt till det directoryt till "PATH" så hittar datorn det. "TERM" är också en variabel som man själv ska påverka, den anger vilken terminaltyp man har, något som styr hur datorn kommer att agera när man startar t.ex. en skärmorienterad editor. Det finns ett kommando som heter "export", vars funktion är att se till att de variabler man anger efteråt kommer att vara tillgängliga för alla program man startar. Normalt sett är alla variabler lokala och deras värden kommer inte att vara tillgängliga för andra program. > > $ export PATH MAIL HOME TERM > En slutlig kommentar om variabler är att för att få behålla värdena på dessa variabler så måste man se till att de ligger i den initierings-fil som shellen använder, annars försvinner värdena efter denna session (!). Initierings-filen för shellen heter ".profile", den läses endast vid inloggning. Ett annat kommando som är bra att känna till är "umask", det styr vilken skyddskod filer får (om man inte ändrar den med "chmod") vid nyskapande: > > $ umask > 022 > $ date >tmp1 > $ ls -l tmp1 > -rw-r--r-- 1 jp 29 May 1 07:41 tmp1 > $ umask 0 > $ date >tmp2 > $ ls -l tmp2 > -rw-rw-rw- 1 jp 29 May 1 07:41 tmp2 > $ umask 027 > $ date >tmp3 > $ ls -l tmp3 > -rw-r----- 1 jp 29 May 1 07:41 tmp3 > $ umask 077 > $ date >tmp4 > $ ls -l tmp4 > -rw------- 1 jp 29 May 1 07:41 tmp4 > $ > Skyddskoden man anger efter "umask" anger de rättigheter man ska ta bort för att få den slutliga skyddskoden. Normalt när man skapar vanliga textfiler är 666 den vanliga skyddskoden (777 för exekverbara filer). Se manualen. Exempel på vad som kan finnas i initierings-filen: > > $ cat .profile > stty -lcase -tabs cr0 ff0 nl0 erase ^H kill ^U intr ^? echoe > PATH="/user/bin:/bin:/usr/bin:/etc:/usr/games:." > MAIL="/usr/spool/mail/jp" > TERM=abc1600p > export PATH MAIL TERM > umask 022 > $ > Uppsättning av terminal-parametrar ("stty"), PATH, MAIL, TERM, "export"-ering av variablerna, "umask" (mask för skapande av filer). Det finns mer att lära sig om shellen, se i manualen ("man sh"). Datasäkerhet Vad beträffar säkerhet så gäller det givetvis att man bör akta sig för alltför lättgissade lösenord. Sitt eget personliga lösenord kan man ändra med kommandot "passwd". Lösenord som man speciellt bör undvika är t.ex. test, demo, system, unix, root, secret, secure, love, sex, sys, qwerty, gazonk, asdf, 123 m.m. Dessutom bör lösenord inte innehålla namn, ha anknytning till arbetet eller vara telefonnummer. Allra viktigast är att inte ha lösenordet uppskrivet t.ex. under tangentbordet. Vill man hålla saker skyddade för andra bör man också tänka på att skydda sina filer på rätt sätt. Informationen om alla användare finns i filen "/etc/passwd" som kan läsas av alla (lösenorden är dock krypterade med en irreversibel algoritm (kallad DES)). I UNIX finns det en super-användare (en användare som har alla rättigheter och kan gå förbi alla skyddskoder), det är användaren som heter "root" (med användar-id (uid) 0). Editorer och textbehandling I de flesta UNIX-system finns det flera editorer. Standard är att "ed" (rad- orienterad) och "vi" (skärmorienterad) finns, men ofta finns det en "emacs" (förkortning av Editing MACroS, skärmorienterad) eller någon av dess kloner (t.ex. MicroEmacs, jove (Jonathan's Own Version of Emacs)). Då det gäller textbehandling finns det en formatterare som heter "nroff" (för- kortning av New RunOFF) som är avsedd för utskrift på vanlig radskrivare, och "troff" (Typesetter RunOFF) som är avsedd för laserskrivare. Ibland finns också andra formatterare som t.ex. "aform". On-line manualen Hittills har vi endast i förbifarten nämnt att det finns en on-line manual på alla UNIX-system, men det vi inte nämnt är att den är indelad i avdelningar (sections). Det finns åtta avdelningar i manualen, och de är: 1. Exekverbara program (som startas från shellen) 2. Systemanrop 3. Biblioteksfunktioner 4. Speciella filer och hårdvarustöd 5. Filformat 6. Spel- och demoprogram 7. Diverse information 8. Systemunderhåll Ett exempel på ämnen som återfinns under flera avdelningar är "tty", det finns dels under avdelning 1 (exekverbara program) och avdelning 4 (filen "/dev/tty"). När man anger "man kommando" så innebär det att datorn söker igenom avdelningarna tills den hittar manualsidan för "kommando", så långt inga problem. Men antag nu att man söker efter ett kommando som har flera referenser (t.ex. "tty"), då kommer man alltid att få se den manualsida som finns i den första avdelningen där den påträffas (för "tty" är det 1), trots att man kanske ville se en helt annan manualsida (t.ex. den i avdelning 4 för "tty"). För att lösa sådana problem anger man dessutom avdelningens nummer, kommandot heter då inte "man kommando" utan "man avdelning kommando" (i vårt exempel med "tty" skriver man alltså "man 4 tty"). Man kan dessutom få lite allmän information om varje avdelning genom att be att få se en manualsida som heter "intro", den finns i alla avdelningar och ger en allmän översikt av vad avdelningen innehåller. Om man söker information om något kan man också använda "man"-kommandot, men då anger man en switch (option) som heter "-k". Om man t.ex. söker efter ett kommando som har något med lösenord att göra ("password" på engelska) kan man prova med att ge kommandot "man -k password". Systemfunktioner UNIX innehåller ett interface av funktioner som alla (med vissa undantag) kan använda sig av för att utföra olika saker, t.ex. öppna filer, skriva till fil, allokera minne, byta directory m.m. Några exempel på sådana funktioner är read, write, open, close, creat, link, unlink, chdir, mknod, chmod, chown, stat, mount, umount, utime, ioctl, kill, break, ptrace, alarm, getpid, setuid, setgid, sync, dup, pipe, chroot. Man använder sig oftast av dessa funktioner när man programmerar, t.ex. i språket C. Ibland använder man sig av biblioteksfunktioner, som i sin tur anropar funktionerna. Processer Allt man gör i UNIX, alla program man kör (inloggningen utförs också av ett program) innebär att man kommer i kontakt med processer. En process är helt enkelt ett jobb som datorn exekverar (liksom shellen man skriver in kommandon till är det), oftast samtidigt som tiotals andra gör det. Processerna använder sig av systemanrop (anrop av systemfunktioner i UNIX- kärnan) för att göra det de vill (öppna filer, ändra prioritet på processen, m.m.). Alla processer har ett id (process-id, kallat pid) som unikt identifierar processen bland de övriga. För att se vilka processer som körs under systemet vid en given tidpunkt kan man använda kommandot "ps". Kompilering under UNIX > > $ cc fil.c > Kompilera ett C-program > > $ pc fil.pas > Kompilera ett Pascal-program > > $ f77 fil.f > Kompilera ett Fortran-program Alla dessa kommandon genererar en exekverbar fil som heter "a.out". För att slippa döpa om den för hand kan man vid kompileringen skriva: > > $ cc -o fil fil.c > Signaler Under UNIX finns det något som kallas för signaler. En signal är ett meddelande till en process, oftast om att något gått fel, eller att någon önskar terminera processen. Vad som händer då en signal kommer är styrt av tillämpnings- programmet (med undantag för signal nummer 9 som aldrig kan stoppas). Skicka signaler till andra processer kan man (d.v.s. om man har rätt till det (!)) göra med kommandot "kill". Exempel: > > $ kommando & > 42 > $ kill 42 > $ > Efter att man startat "kommando" som bakgrundjobb (med tecken "&" i shellen) så skrivs dess process-id (pid) ut. Det använder man sedan som argument till programmet "kill" för att skicka en signal till programmet. Programfel Om något allvarligt fel uppstår under körningen av ett program görs en kopia av processens minne till filen "core". Denna kan undersökas med kommandot "adb", som är en debugger (se manualen). Observera att det INTE är en bra ide' att döpa filer till "core" eller "a.out". Några hjälpmedel under UNIX "lint" är ett program som letar efter fel och brister i C-program, ett bra test på hur bra koden man skrivit är. Anledningen till att denna finns är att C- kompilatorn ("cc") inte är så sträng vid kompileringen. "lex" är en lexikalisk analysator-generator, den genererar första delen av en kompilator. "yacc" är en s.k. parsergenerator, som (ofta, men inte nödvändigtvis) används tillsammans med "lex". Den underlättar avsevärt konstruktionen av kompilatorer och liknande program. Kommunikation under UNIX Det finns en hel mängd utilities avsedda för kommunikation mellan datorer under UNIX, bl.a. finns det ett paket med programvara ("uucp", Unix tp Unix CoPy) som är avsett för kopiering av data mellan datorer, email som fungerar mellan datorer (idag kan man enkelt skicka email över hela världen), läsa elektroniska nyheter från USEnet (via programvaran "news" ("rn", "nn", "trn" eller någon annan nyhetsläsare)). Idag finns det helt enkelt mängder av meddelanden som skickas elektroniskt. Ett filöverförings-program som används flitigt över hela världen är C-Kermit. Kryptiska kommandonamn UNIX är dessvärre ganska dåligt på att ge namn på kommandon, det är inte lätt att vara nybörjare när kommando-namnen är så korta och koncisa. Några exempel: Namn Kort förklaring av namnet ---------------------------------------------- awk Aho, Weinberger, Kernighan cat CATenate egrep Extented grep fgrep Fixed grep grep Global Regular Expression and Print pwd Print Working Directory wc WordCount Kompatibilitet mellan olika versioner av UNIX Kompatibiliteten mellan olika versioner av UNIX är ganska bra, dock finns det en del saker som kan orsaka problem för programmerare (vid överföring (portering) av kod från en UNIX-variant till en annan): Signalering Processstyrning Grupp-identiteter Tidsfunktioner m.m. I övrigt kan dessutom syntaxen och utskrifterna från kommandon skilja lite, det rör t.ex. kommandot "ls". I UNIX-varianter som kommer ifrån AT&T finns inte alltid manualen on-line utan kanske bara i tryckt form. UNIX och shellar I UNIX finns det inte bara en enda shell att arbeta mot. Den shell vi hittills visat exempel på kallas "Bourne-shell" (programnamnet är "sh", skaparen heter "Steven Bourne"). Det finns också "C-shell" (programnamnet är "csh", den har en C-liknande syntax), "Korn-shell" (programnamnet är "ksh", skaparen heter "David Korn"), med flera. För att se vad som skiljer shellarna från varandra så får man titta i manualen (t.ex. "man csh"). UNIX och GNU GNU, förkortning av "GNU is not UNIX", är en organisation som strävar efter att programvara ska vara fri från patent, vara tillgänglig för alla (källkoden ska vara fri) och endast ha en distributionskostnad. GNU är baserat på bidrag från utomstående, och är inriktat på att producera programvaror, för i första hand UNIX, som är fria versioner av copyright-ade program under UNIX. De har producerat en hel rad mycket bra programvaror (som alltid är åtskilligt effektivare än originalen), några exempel på detta är Emacs (en fullskärms- editor, väldigt populär), gcc (en bra C-kompilator), bison (en ersättare för yacc), flex (ersättare för lex) m.m. En av de ledande personerna bakom GNU är Richard M. Stallman.