Arbeiten in einem Projektteam Warum Teamarbeit ? Im Team kann man in weniger Zeit mehr erreichen Das Team erhöht die Kreativität Voneinander lernen Erhöhung der Qualität Unterschiedliche Lösungsalternativen Bessere Erkennbarkeit von Fehlerquellen Arbeiten in einem Projektteam Arbeitsteilung Festlegung wer für welche Teile ( Module ) zuständig ist Definition von Schnittstellen Datenstrukturen+Zugriffsfunktionen in einem Modul Funktionsbibliotheken Selbständige Implementierung und Test der Module Testumgebung festlegen Festhalten an einem Zeitplan, wann welche Teile fertig sind, wann Integration stattfinden soll 1 Arbeiten in einem Projektteam Kommunikation Austausch von Kontaktadresse Festlegung von gemeinsamen Besprechungen Erstellen und Verteilen von Besprechungsprotokollen Moderation durch einen Teamleader Arbeiten in einem Projektteam Soziale Komponente Zuverlässigkeit Sich an Zusagen halten Termine wahrnehmen Im Verhinderungsfall rechtzeitig bei allen abmelden Konfliktbewältigung Probleme sofort und offen besprechen Kompromisse eingehen Toleranz zeigen Bei Problemen sich gegenseitig helfen 2 Teamarbeit Onlinekurs zu Teamarbeit http://www.teachsam.de/arb/team/team_3.htm Einführung in Linux Systemprogrammierung Prozesse Prozesse stehen immer in Vater/Sohn-Beziehung d.h. jeder Prozess hat einen parent root Prozess init ist parent aller Prozesse Prozesse erben ihre Zugriffsrechte vom aufrufenden Benutzer Kindprozesse können in den Zustand zombie gelangen 3 Einführung in Linux Systemprogrammierung Unix Werkzeuge Unix Tools haben eine Hilfe die mit -h –help aufgerufen wird Ausführliche Beschreibung unter man <toolname> Unix Tools sind zur Zusammenarbeit konzipiert worden Über Pipes können Werkzeuge Daten austauschen Einführung in Linux Systemprogrammierung Shell Kommandointerpreter zur Kommunikation mit dem System bietet einen sehr mächtigen Scriptinterpreter hält Umgebungsvariablen wie $PATH äußerst mächtig 4 Einführung in Linux Systemprogrammierung Shell Command --help Liefert zu den meisten Befehlen weitere Hilfe. zeigt eine Liste der laufenden Prozesse an Listet alle benutzen ipcRessourcen auf Entfernt manuell ipcResourcen ps –help kill Terminiert Prozesse kill 1234 man <hilfethema> Liefert die Beschreibung zu einem Kommando einer Funktion oder Befehl man getpid ps ipcs ipcrm ps –al ipcrm shm 12345 . Einführung in Linux Systemprogrammierung Programmierwerkzeuge Texteditoren vi Emacs vim C-Compiler gcc Modulverwaltung make Versionsverwaltung subversion 5 Einführung in Linux Systemprogrammierung Systemfunktionen Prozesse pid_t getpid() pid_t getppid() fork() Liefert pid des Prozesses vom Typ pid_t Liefert pid des parent Prozesses Erzeugt identische Kopie vom Aufrufer Liefert pid des child im Vater. Ist im child immer 0 execl( &filename, &arg) Startet ein neues Programm aus einer exeDatei. Liefert: -1 bei Fehler exit(staus) Freiwilliges Ende des Prozesses wait() wartet auf des Ende eines Sohnes und holt den returnwert ab. waitpid() Abholen eines returnwertes ohne auf das Ende des Sohnes warten zu müssen Einführung in Linux Systemprogrammierung Systemfunktionen Signale asynchron Wird ein Signal an einen Prozess gesendet, so wird sofort ein Signalhandler angestossen, der alle notwendigen Aktionen ausführt i.a. Terminierung eigenen Signalhandler einrichten signal( signal, functionpointer) Richtet einen Signalhandler ein die übergebene Funktion wird aufgerufen wenn das Signal vom ankommt Signal senden kill( PID, signal ) Auf ein Signal warten pause(signal) 6 Einführung in Linux Systemprogrammierung IPC Systemobjekte Systemobjekte werden über einen key angesprochen Einen eindeutigen key man mit der Funktion ftok() erzeugen ftok( “../keyfile”, int nummer) Liefert: liefert einen key vom Typ key_t Einführung in Linux Systemprogrammierung Systemfunktionen Nachrichten Erzeugen einer Message-Queue msgget( key, IPC_CREAT | IPC_EXCL | 0600 ) Liefert: ID der erzeugten MSQ Erwartet: eindeutigen key ( am besten mit ftok() erzeugen ) Senden einer Nachricht msgsnd( id, &message, sizeof(message), 0) Liefert: 0 bei Erfolg Erwartet: id von existenter MSQ, Adresse von message struct, Größe der message sowie flags Abholen einer Nachricht ( blockierend ) msgrcv( id, &message, sizeof(message), type, 0) Liefert: bei Erfolg die tatsächliche Größe der message sonst -1 Erwartet: type = 0 dann FIFO ansonsten wird geholt was dem type entspricht Vernichten einer Message-Queue msgctl( id, IPC_RMD, &buffer) Liefert: 0 bei Erfolg sonst -1 Erwartet: Kommando ob Status Überprüfung oder Löschen der Message Queue gefragt ist, falls IPC_STAT dann wird die Antwort in buffer geschrieben 7 Einführung in Linux Systemprogrammierung Systemfunktionen Semaphore Erzeugen eines Semaphores semget( key, amount, IPC_CREAT | IPC_EXCL | 0600) Liefert: bei Erfolg ID der SEMM sonst -1 Erwartet: eindeutigen key_t, Menge der Semaphore P-Operation semop( id, list, amount ) Liefert: bei Erfolg die ID der Semaphormenge sonst -1 Erwartet: die eine Liste vom Typ sembuf, sowie die Anzahl der list elemente amount ist negativ V-Operation semop( id, list, amount ) Liefert: bei Erfolg die ID der Semaphormenge sonst -1 Erwartet: die eine Liste vom Typ sembuf, sowie die Anzahl der list elemente amount ist positiv Vernichten eines Semaphores semctl( id, IPC_RMD, &buffer) Liefert: 0 bei Erfolg sonst -1 Erwartet: Kommando ob Status Überprüfung oder Löschen des SEM gefragt ist, falls IPC_STAT dann wird die Antwort in buffer geschrieben Einführung in Linux Systemprogrammierung Systemfunktionen Shared Memory Erzeugen shmget( key, sizeof(element) * 100, IPC_CREAT | 0600) Liefert: bei Erfolg die ID der SHM Erwartet: Die Größe des gewünschten SHM Segments Einfügen in den virtuellen Adressraum shmat( id, 0, 0) Liefert: Die Adresse auf das SHM Segment Lösen aus dem Adressraum shmdt( &address) Liefert: 0 bei Erfolg Erwartet: Adresse auf das SHM Segment Vernichten shmctl( id, IPC_RMD, &buffer) Liefert: 0 bei Erfolg sonst -1 Erwartet: Kommando ob Status Überprüfung oder Löschen des SHM gefragt ist, falls IPC_STAT dann wird die Antwort in buffer geschrieben 8 Einführung in Linux Systemprogrammierung PIPE anonyme pipe nur zwischen Vater/Sohn möglich Bytestream, unidirektional, Zugriffe über Filedeskriptoren Vaterprozeß erzeugt eine Pipe Lesen und schreiben in eine pipe read(), write() pipe() named pipe Braucht keine Vater/Sohn-Beziehung Erzeugen einer pipe int mkfifo ( char *pipename, int mode ); Öffnen einer Pipe int open ( char *name, int flag, int mode ); Löschen einer Pipe int unlink ( char *name ); Einführung in Linux Systemprogrammierung Threads PThread Bibliothek #include <pthread.h> Thread erzeugen int pthread_create (pthread_t *thread, ... void *(*thread_function)(void *),…) Thread freiwillig terminieren int pthread_exit (void *status) Auf das Ende eines Thread warten int pthread_join (pthread_t thread, …) Thread-ID erfragen pthread_t pthread_self () 9 Einführung in Linux Systemprogrammierung IPC und Threads Mutex-Objekte int int int int pthread_mutex_init (…) pthread_mutex_lock (…) pthread_mutex_unlock (…) pthread_mutex_destroy (…) Signale Asynchron, analog Signalen zwischen Prozessen int pthread_kill(….) Sendet ein signal sig an ein Thread int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset); Ändert die Signalmaske für den aufrufenden Thread Auf ein Signal warten sigwait(&signalSet,&sigNr); Petrinetze Darstellung nebenläufiger Aktionen Stellen zwischen Prozessen / Threads sind Synchronisationsstellen im Programm Verwendung von Petrinetzsimulatoren Zeichnen und Editieren Simulation Sie finden ein Windowsprogramm auf meiner homepage ( visobjnet20.exe ) 10