printenv sort pager printenv grep args sort pager

Relevanta dokument
... Funktionsanrop. Vad händer när man kör ett program?

Möte 7: Uppföljning av föreläsningen med Peer Instruction - (PI)

Vad händer när man kör ett program? Program och processer. Funktionsanrop. Avsluta programmet

(2) Skriv ett program som skapar ett antal processer vars relationer beskrivs av nedanstående tidsdiagram a

Grundprogrammen. combine

Systemnära programmering Tentamen. Systemnära programmering, 7.5hp 5 november 2012

read Systemanrop i UNIX Exempel med read & write write int antal_tkn, fd, count; char buffer[size]; antal_tkn = read(fd, buffer, count);

Raspberry Pi och Tellstick, ett program i C.

Programmeringsteknik med C och Matlab

2... uppvisa förmåga att skapa och/eller hantera flerprocessiga program där de ingående processerna ges

Användbara systemanrop och biblioteksfunktioner. 2G1520 Operativsystem

Möte 10: Kommunikation mellan processer - (PI)

Möte 9: Relationer mellan körande processer - (PI)

Tellstick-15.c. Kompilering av programmet: gcc -o tellstick-15 -Wall -ltelldus-core -W -O2 -s -pipe -lm tellstick-15.c

Operativsystem ID1200/06 Tentamen :00-18:00

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Avancerad SSL-programmering II

HI1025 Operativsystem, KTH Haninge, VT2012

Pekare och arrayer. Indexering och avreferering

Övning från förra gången: readword

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

Introduktion C-programmering

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Repetition C-programmering

Isometries of the plane

Typkonvertering. Java versus C

Information Coding / Computer Graphics, ISY, LiTH CUDA. En lösning för generella beräkningar. En introduktion: Programmingsmodell och språk

Dagens föreläsning. Specialtecken. Mer om printf. Formateringssträngar. Mer om scanf. Programmeringsteknik för Ingenjörer VT05

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

Del II: Systemprogrammering och Inter-Process Communication.

Föreläsning 13. In- och utmatning

Calculate check digits according to the modulus-11 method

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

Programmering i C, 7,5 hp

Innehållsförteckning. Exempel. Åtkomst & användarhandledning

Föreläsning 3. Programmering, C och programmeringsmiljö

Exempelsamling Assemblerprogrammering

Tentamen *:58/ID100V Programmering i C Exempel 3

Tillämpad programmering

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Tentamen PC-teknik 5 p

Fakulteten för ekonomi, kommunikation och IT. Corba. Datum: Mathias Andersson

C++ Slumptalsfunktioner + switch-satsen

Operativsystem (ID2200/06) XX XX:00-XX:00

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg, 2018

Och!efter!ca!20!omgångar!hamnade!den!på!en!stabil!konfiguration!enligt!nedan! där!den!stannar!kvar.!

Att skriva till och läsa från terminalfönstret

DAT043 Objektorienterad Programmering

Signaler. Icke tillförlitliga signaler. Vad göra?

Komponenter med COM (och COM+/VC++ 7.0)

Static vs Dynamic binding Polymorfism. Objekt-orienterad programmering och design Alex Gerdes, 2016

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Lösenordsportalen Hosted by UNIT4 For instructions in English, see further down in this document

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Introduktionslaboration

Laboration: Whitebox- och blackboxtesting

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Introduktionslaboration

1. Varje bevissteg ska motiveras formellt (informella bevis ger 0 poang)

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Administrivia Programmering Grunderna i C Kortspel. Programmering. Sommarkurs Verónica Gaspes.

Grundläggande datalogi - Övning 1

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås

Tentamen Datorteknik och realtidssystem, TSEA81 Datum Lokal

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

Poster ( structar ) Postdeklarationer

Instruktioner för att kunna programmera på skolans datorer

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Föreläsning 3. Programmering, C och programmeringsmiljö

Sammanfattning. Listor. List-manipulering. Matris. /home/lindahlm/activity-phd/teaching/11dd1310/exercise3/exercise3.py September 13, 20111

Classes och Interfaces, Objects och References, Initialization

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Föreläsning 4 IS1300 Inbyggda system

Fö 8 TSEA81. Real-time Linux

Laboration 2, Materials Termodynamik

Michael Q. Jones & Matt B. Pedersen University of Nevada Las Vegas

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Inkapsling tumregler. Åtkomstmodifikatorer, instantiering, referenser, identitet och ekvivalens, samt klassvariabler. public och private

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Tillfälle 14 (F): Fördjupat studium av parallellitet och synkronisering: processer, trådar, schemaläggning och signaler.

Uttagning för D21E och H21E

Det finns många flaggor till g++,


Programmeringsteknik med C och Matlab

Deklarera en struct som kan användas för att representera en rät linje

Hur man kompilerar och kör IT++-program med MinGW. 1 Sammanfattning. 2 Om dokumentet. 3 Om min konfiguration

Om pekare och minneshantering i C, relaterat till operativsystem och särskilt konstruktionen fork() execvp().

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Tentamen FYTA11 Javaprogrammering

Operativsystem ID2200/06 omtentamen :00-12:00

Programräknaren visar alltid på nästa instruktion som skall utföras. Så fort en instruktion har hämtats så visar programräknaren på nästa instruktion.

UNIX verktyg. Användbara kommandon Fil och informationssökning Tags Versionshanteringssystem

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Metodprov för kontroll av svetsmutterförband Kontrollbestämmelse Method test for inspection of joints of weld nut Inspection specification

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

Övning 1 - Abstrakta datatyper

Transkript:

1 Problembeskrivning Uppgiften var att skriva ett program, digenv för att visa miljövariabler. programmet vara ekvivalent med att köra: Kört utan argument så skulle printenv sort pager och kört med argument så skulle det vara ekvivalent med att köra: printenv grep args sort pager där pager väljs som den först tillgängliga av $PAGER less more. 2 Programbeskrivning Programmet är relativt simpelt. Vi skapar pipes, sedan forkar vi de andra programmen (printenv, grep, sort och $PAGER) ett efter ett. Om vi inte får in några argument till programmet så kör vi grep ändå, fast utan argument. Detta ger lite sämre prestanda, men å andra sidan blir programmet mer uniformt. Egentligen borde flagorna till grep kontrolleras, så de inte innehåller -f eller file, eftersom dessa flaggor är korrekta, men förstör pipen. Men eftersom programmet skulle vara ekvivalent med att köra en viss pipe, så har vi inte implementerat den checken. Kdoen finns i appendix. 3 Kompilering och exekvering Programmet kompileras tex med kommandot: gcc -Wall hacked_digenv.c -o digenv Programmet kan köras utan argument, med argument och med miljövariabeln PAGER satt till det man vill. Till exempel:./digenv PAGER=more./digenv./digenv term PAGER=cat./digenv -i term Följande är ett exempel på en körning utan argument. ALTERNATE_EDITOR= COLORFGBG=12;default;8 COLORTERM=rxvt-xpm COLUMNS=134 DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-78isgF0B4Y,guid=1f2122f416aa0f3d7874ec9352d2643a DESKTOP_STARTUP_ID=i3/urxvtc/317-0-joakim-nb_TIME39735 DISPLAY=:0.0 EMACS=24.3.1 (term:0.96) GTK_MODULES=canberra-gtk-module HOME=/home/joakim 1

_=/home/joakim/skola/os/kompl_lab1/./digenv INSIDE_EMACS=24.3.1,term:0.96 JAVA_HOME=/usr/lib/jvm/java-7-openjdk KRB5_CONFIG=/home/joakim/pdckrb/krb5.conf LANG=en_US.UTF-8 LINES=77 LOGNAME=joakim MAIL=/var/mail/joakim MOZ_PLUGIN_PATH=/usr/lib/mozilla/plugins OLDPWD=/home/joakim/skola/os/kompl_lab1 PAGER=cat PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/vendor_perl:/usr/bin/core_perl PWD=/home/joakim/skola/os/kompl_lab1 SERV=85.229.180.20 SHELL=/bin/zsh SHLVL=3 SKOLAN=jjalap@u-shell.csc.kth.se TERMCAP=eterm-color:li#78:co#131:cl=\E[H\E[J:cd=\E[J:bs:am:xn:cm=\E[%i%d;%dH:nd=\E[C:up=\E[A:ce=\E[K:ho= TERMINFO=/usr/share/emacs/24.3/etc/ TERM=xterm-256color TEXINPUTS=.:/home/joakim/.emacs.d/elpa/auctex-11.87.2/latex: USER=joakim WINDOWID=16777222 XAUTHORITY=/home/joakim/.Xauthority XDG_RUNTIME_DIR=/run/user/1000 XDG_SEAT=seat0 XDG_SESSION_ID=1 XDG_VTNR=7 Följande är ett exempel på en körning med argument -i term. COLORTERM=rxvt-xpm EMACS=24.3.1 (term:0.96) INSIDE_EMACS=24.3.1,term:0.96 TERMCAP=eterm-color:li#78:co#131:cl=\E[H\E[J:cd=\E[J:bs:am:xn:cm=\E[%i%d;%dH:nd=\E[C:up=\E[A:ce=\E[K:ho= TERMINFO=/usr/share/emacs/24.3/etc/ TERM=xterm-256color 4 Verksamhetsberättelse Laborationen tog kanske 10 timmar att genomföra. Den första implementationen blev inte godkänd på grund av att vi skapade en temporär fil, vilket man inte fick. Vi missade delen av labblydelsen där det står att man inte får skapa temporära filer (åtminstone delvis på grund av att den inte existerar). 5 Svar på frågor 1. init 2. Barnprocessen ärver sin förälders miljö, så det går att kommunicera åt ena hållet men inte åt andra. 3. Det går inte att fånga SIGKILL och SIGSTOP. Som det står i mansidorna: the system silently enforces this. 2

4. Därför att det finns en biblioteksfunction som returnerar processens egen pid (getpid(3)) men ingen som returnerar barns pid. 5. Nej. Till exempel så implementeras reference counting i kärnans File Table, så att en fil stängs först när ingen process har den öppen, istället för när den första processen stänger den. Flera entries i olika processers File descriptor tables kan ju peka på samma entry i kärnans File Table. 6. Nej, det kan man inte. Programmet avslutas inte då. 7. Om de tex delar en pipe så kommer den andra processen få en SIGPIPE signal skickad till sig. 8. Exitstatusen är 0 om något hittades, 1 om inget hittades men allt gick bra i övrigt och större än 1 om något gick snett. 1 Kod / NAME: digenv - A program to show envorinment variables SYNTAX: digenv [args] DESCRIPTION digenv without options is equivalent to: printenv sort pager, where pager is either the program by the environment variable PAGER, or if no such variable is set, less(1). digenv args is equivalent to: printenv grep args sort pager, with pager set as above. OPTIONS Any options will be interpreted as options to grep(1), see above. EXAMPLES Without options:./digenv With more(1) as the pager: PAGER=more./digenv With options:./digenv -i term ENVIRONMENT The program indicated by the environment variable PAGER, will be used as the pager in the final step of the pipeline. If PAGER is not set, less(1) will be used. If less(1) failes to execute more(1) wil be tried. SEE ALSO printenv(1), grep(1), sort(1), less(1), more(1) AUTHOR This program was written by Joakim Jalap (jjalap@kth.se) and Daniel Schiess (schiess@kth.se) 3

/ #include <stdio.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h> #include <stdlib.h> int pipes[3][2]; void err(char msg) { perror(msg); exit(exit_failure); void mkpipes(void) { int i; for (i=0; i<3; i++) if (pipe(pipes[i])) err("failed making pipes"); void close_or_die(int fd) { if (close(fd) == -1) err("failed closing a file descriptor"); void close_pipes(int stage) { switch(stage) { case 1: case 2: 4

case 3: err("invalid argument to close_pipes(int)"); void dup_pipes(int stage) { switch(stage) { if (dup2(pipes[0][1], STDOUT_FILENO) == -1) err("failed to dup stdout in printenv"); case 1: if (dup2(pipes[0][0], STDIN_FILENO) == -1) err("failed to dup stdin in grep"); if (dup2(pipes[1][1], STDOUT_FILENO) == -1) err("failed to dup stdout in grep"); case 2: if (dup2(pipes[1][0], STDIN_FILENO) == -1) err("failed to dup stdin in sort"); if (dup2(pipes[2][1], STDOUT_FILENO) == -1) err("failed to dup stdout in sort"); case 3: if (dup2(pipes[2][0], STDIN_FILENO) == -1) err("failed to dup stdin in pager"); err("illegal arguments to dup_pipes(int)"); int main(int argc, char argv) { int pids[4]; int stat; mkpipes(); switch(pids[0] = fork()) { err("failed to fork printenv"); dup_pipes(0); close_pipes(0); execlp("printenv", "printenv", NULL); err("failed to exec printenv"); 5

switch(pids[1] = fork()) { err("failed to fork grep"); dup_pipes(1); close_pipes(1); if (argc == 1) execlp("grep", "grep", "", NULL); else {argv[0] = "grep"; execvp("grep", argv); err("failed to exec grep"); switch(pids[2] = fork()) { err("failed to fork sort"); dup_pipes(2); close_pipes(2); execlp("sort", "sort", NULL); err("failed to exec sort"); switch(pids[3] = fork()) { err("failed to fork pager"); { char pager; dup_pipes(3); close_pipes(3); if ((pager = getenv("pager"))) execlp(pager, pager, NULL); else { execlp("less", "less", NULL); execlp("more", "more", NULL); err("failed to exec pager"); close_pipes(-1); int i; for (i=0; i<4; i++) { 6

if (waitpid(pids[i], &stat, 0) == -1) err("failed to wait"); fprintf(stderr, "Process nr %d exited with status %d, and the result of wexitstatus is %d\n", i, sta if ((i == 1 && WEXITSTATUS(stat) > 1) (i!= 1 && WEXITSTATUS(stat)!= 0)) { fprintf(stderr, "Process %d exited abnormally, killing rest of chain\n", i); int f; for (f=i+1; f<4; f++) { fprintf(stderr, "sending SIGKILL to process %d\n", f); if (kill(pids[f], SIGKILL) == -1) err("couldn t even kill a process, dying"); return EXIT_FAILURE; return EXIT_SUCCESS; 7