diff options
| author | Manuel Traut <manut@linutronix.de> | 2010-12-01 12:08:10 +0100 |
|---|---|---|
| committer | Manuel Traut <manut@linutronix.de> | 2010-12-01 12:08:10 +0100 |
| commit | ff17613cf37db72955edd0b6bfaeecf573791736 (patch) | |
| tree | 2a1bb0a67720215d6dc08ff52c183c30e9754af2 /application-devel/posix-ipc | |
| parent | 9634fb0c75c4c3f227772ec9ddf22f992f35013c (diff) | |
| parent | 4cfb9eb272daf14b7975018df0aa9332971f8d5f (diff) | |
Merge branch 'continental' of tglx.de:/home/jan/git/schulung into jan
Diffstat (limited to 'application-devel/posix-ipc')
| -rw-r--r-- | application-devel/posix-ipc/Makefile | 9 | ||||
| -rw-r--r-- | application-devel/posix-ipc/pres_posix_ipc_de.tex | 414 |
2 files changed, 423 insertions, 0 deletions
diff --git a/application-devel/posix-ipc/Makefile b/application-devel/posix-ipc/Makefile new file mode 100644 index 0000000..4663d52 --- /dev/null +++ b/application-devel/posix-ipc/Makefile @@ -0,0 +1,9 @@ +all: + for pdf in `ls -1 *.tex` ; do \ + pdflatex $$pdf; \ + pdflatex $$pdf; \ + done + +clean: + rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out + diff --git a/application-devel/posix-ipc/pres_posix_ipc_de.tex b/application-devel/posix-ipc/pres_posix_ipc_de.tex new file mode 100644 index 0000000..cd5027e --- /dev/null +++ b/application-devel/posix-ipc/pres_posix_ipc_de.tex @@ -0,0 +1,414 @@ +\documentclass[11pt]{beamer} + +%\usepackage{ngerman} +\usepackage{times} +\usepackage{graphicx} +\usepackage{pgf,pgfarrows,pgfnodes,pgfautomata,pgfheaps} +\usepackage{amsmath,amssymb} +\usepackage[utf8]{inputenc} +\usepackage{listings,color} +\definecolor{lbcolor}{RGB}{255,210,150} +\lstset{ + language=C, + numbers=left, + stepnumber=1, + numbersep=5pt, + numberstyle=\tiny, + breaklines=true, + breakautoindent=true, + postbreak=\space, + tabsize=2, + basicstyle=\ttfamily\fontsize{7}{9}\selectfont, + showspaces=false, + showstringspaces=false, + extendedchars=true, + backgroundcolor=\color{lbcolor}, + keywordstyle=\bf , + commentstyle=\color{green}, + stringstyle=\color{red} +} + +\mode<presentation> +{ + \usetheme{linutronix} +} + +% on the following slides, include icon in the left sidebar +\def\lximg{/usr/share/lx/icons/fueller.png} + +\title{POSIX IPC} +\institute{Linutronix GmbH} + +\begin{document} + +\frame{ \titlepage } + +% stop displaying 'fueller.png' on the following slides +\def\lximg{none} + +%\AtBeginSection[] +%{ +% \begin{frame}<beamer> +% \tableofcontents[currentsection,currentsubsection] +% \end{frame} +%} + +\AtBeginSubsection[] +{ + \begin{frame}<beamer> + \tableofcontents[currentsection,currentsubsection] + \end{frame} +} + +\begin{frame} + \tableofcontents +\end{frame} + +\begin{frame} +\frametitle{POSIX IPC: Übersicht} +\begin{itemize} +\item Message Queues +\item Semaphores +\item Shared Memory +\end{itemize} +\end{frame} + +\section{Message Queues} +\begin{frame} +\frametitle{POSIX Message Queues} +\begin{itemize} +\item Austausch von Daten in Form von Messages +\item Messages sind priorisierbar +\item Höchste Priorität wird zuerst ausgeliefert +\item Virtuelles Filesystem unter /dev/mqueue +\end{itemize} +\end{frame} + + +\begin{frame}[fragile] +\frametitle{POSIX Message Queues: API} +Message Queue öffnen / neu anlegen: +\begin{lstlisting} + #include <fcntl.h> + #include <sys/stat.h> + #include <mqueue.h> + + mqd_t mq_open(const char *name, int oflag); + mqd_t mq_open(const char *name, int oflag, + mode_t mode, struct mq_attr *attr); +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{POSIX Message Queues: API} +Message Queue schliessen: +\begin{lstlisting} + #include <mqueue.h> + + mqd_t mq_close(mqd_t mqdes); +\end{lstlisting} +Message Queue löschen: +\begin{lstlisting} + #include <mqueue.h> + + mqd_t mq_unlink(const char *name); +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{POSIX Message Queues: API} +Messages senden: +\begin{lstlisting} +#include <mqueue.h> + +mqd_t mq_send(mqd_t mqdes, const char *msg_ptr, + size_t msg_len, unsigned msg_prio); + +#define _XOPEN_SOURCE 600 +#include <time.h> +#include <mqueue.h> + +mqd_t mq_timedsend(mqd_t mqdes, const char *msg_ptr, + size_t msg_len, unsigned msg_prio, + const struct timespec *abs_timeout); +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{POSIX Message Queues: API} +Messages empfangen: +\begin{lstlisting} +#include <mqueue.h> + +ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, + size_t msg_len, unsigned *msg_prio); + +#define _XOPEN_SOURCE 600 +#include <time.h> +#include <mqueue.h> + +ssize_t mq_timedreceive(mqd_t mqdes, char *msg_ptr, + size_t msg_len, unsigned *msg_prio, + const struct timespec *abs_timeout); +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{POSIX Message Queues: Beispiel} +Sender: +\begin{lstlisting} +const char message[] = "Hallo\0"; +mqd_t ret; + +mqd_t mq = mq_open ("/my_queue", O_RDWR | + O_CREAT | O_EXCL, 0664, NULL); +if (mq < 0) { + perror("Can't open message queue\n"); + exit(1); +} + +ret = mq_send(mq, message, sizeof(message), 100); +if(ret < 0) + perror("Can't send message\n"); + +mq_close(mq); +return 0; +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{POSIX Message Queues: Beispiel} +Empfänger: +\begin{lstlisting} +char message[8192]; +unsigned prio; +mqd_t ret; + +mqd_t mq = mq_open ("/my_queue", O_RDONLY); +if(mq < 0) { + perror("Can't open message queue\n"); + exit(1); +} + +ret = mq_receive(mq, message, 8192, &prio); +if (ret < 0) + perror("Nothing to receive\n"); +else + printf("Received message %s with prio %u\n", message, prio); + +mq_close(mq); +mq_unlink("/my_queue"); +return 0; +\end{lstlisting} +\end{frame} + +\section{Semaphoren} +\begin{frame} +\frametitle{POSIX Semaphoren: Übersicht} +\begin{itemize} +\item Synchronisation von Threads und Prozessen +\item Named Semaphores +\item Unnamed Semaphores (memory based) +\item Virtuelles Filesystem unter /dev/shm +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Named Semaphores: API} +Semaphore öffnen / neu erstellen: +\begin{lstlisting} +#include <fcntl.h> +#include <sys/stat.h> +#include <semaphore.h> + +sem_t *sem_open(const char *name, int oflag); +sem_t *sem_open(const char *name, int oflag, + mode_t mode, unsigned int value); + +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Named Semaphores: API} +Unlock auf Semaphore: +\begin{lstlisting} +#include <semaphore.h> + +int sem_post(sem_t *sem); +\end{lstlisting} +Lock auf Semaphore: +\begin{lstlisting} +#include <semaphore.h> + +int sem_wait(sem_t *sem); + +int sem_trywait(sem_t *sem); + +int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Named Semaphores: API} +Semaphore schliessen: +\begin{lstlisting} +#include <semaphore.h> + +int sem_close(sem_t *sem); +\end{lstlisting} +Semaphore löschen: +\begin{lstlisting} +#include <semaphore.h> + +int sem_unlink(const char *name); +\end{lstlisting} +\end{frame} + +\begin{frame} +\frametitle{Unnamed Semaphores: Übersicht} +\begin{itemize} +\item Liegen in einem gemeinsamen Speicherbereich (z.B. Shared Memory) +\item Müssen mit sem\_init() initialisiert werden +\item Lock und Unlock mit sem\_post() und sem\_wait() +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Unnamed Semaphores: API} +Initialisieren: +\begin{lstlisting} +#include <semaphore.h> + +int sem_init(sem_t *sem, int pshared, unsigned int value); +\end{lstlisting} +Zerstören: +\begin{lstlisting} +#include <semaphore.h> + +int sem_destroy(sem_t *sem); +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Semaphoren: Beispiel} +\begin{lstlisting} +sem_t *my_sem; +int ret; + +my_sem = sem_open("/my_sem", O_RDWR | O_CREAT | O_EXCL, 0644, 0); +if (my_sem == SEM_FAILED) { + perror("Can't open semaphore\n"); + exit(1); +} + +ret = sem_wait(my_sem); +if(ret < 0) { + perror("sem_wait failed\n"); + exit(1); +} +printf("Here I am :)\n"); + +sem_close(my_sem); +return 0; +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Semaphoren: Beispiel} +\begin{lstlisting} +sem_t *my_sem; +int ret; + +my_sem = sem_open("/my_sem", O_RDWR); +if(my_sem == SEM_FAILED) { + perror("Can't open semaphore\n"); + exit(1); +} + +ret = sem_post(my_sem); +if (ret < 0) + perror("sem_post\n"); + +sem_close(my_sem); + +return 0; +\end{lstlisting} +\end{frame} + +\section{Shared Memory} +\begin{frame} +\frametitle{Shared Memory: Übersicht} +\begin{itemize} +\item Gemeinsam genutzter Speicherbereich +\item mmap() +\item Virtuelles Filesystem unter /dev/shm +\end{itemize} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Shared Memory: API} +Shared Memory anlegen / zerstören +\begin{lstlisting} +#include <sys/mman.h> +#include <sys/stat.h> +#include <fcntl.h> + +int shm_open(const char *name, int oflag, mode_t mode); + +int shm_unlink(const char *name); +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Shared Memory: Beispiel} +\begin{lstlisting} + int fd; int ret = 1; char *addr; + + fd = shm_open("my_shm", O_RDWR | O_CREAT, 0777); + if (fd < 0) { + perror("Can't open Shared Memory\n"); + goto out; + } + if (ftruncate(fd, 4096) == -1) { + perror("ltrunc\n"); + goto out; + } + addr = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) { + perror("mmap() failed\n"); + goto out; + } + ret = 0; + *addr = 'A'; +out: + close(fd); + return ret; +\end{lstlisting} +\end{frame} + +\begin{frame}[fragile] +\frametitle{Shared Memory: Beispiel} +\begin{lstlisting} + int fd; + int ret = 1; + char *addr; + + fd = shm_open("my_shm", O_RDWR, 0777); + if (fd < 0) { + perror("Can't open Shared Memory\n"); + goto out; + } + + addr = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) { + perror("mmap() failed\n"); + goto out; + } + printf("Reading from SHM -> %c\n", *addr); + ret = 0; +out: + close(fd); + return ret; +\end{lstlisting} +\end{frame} +\end{document} |
