Kategorie: C/C++ RSS-Feed für diese Kategorie
C: Speicherallokation: malloc() vs. talloc()
Als ich vor Kurzem auf gentoo Linux ein `emerge -quDN world‘ machte, habe ich ausnahmsweise mal zugeschaut, was da gerade alles aktualisiert wird. Da fiel mir ein Paket namens `sys-libs/talloc‘ auf – und fragte mich, ob das tatsächlich etwas mit Speicherallocation zu tun haben könnte. Kurz gegoogelt bin ich auf einen Artikel von Stephen Gallagher aufmerksam geworden: Why you should use talloc for your next project. talloc ist eine Speicherimplementierung vom Samba-Projekt. talloc bietet hier die Möglichkeit, reservierten Speicher in einem zusammenhängenden Bereich zu erhalten. Welche Vorteile daraus gezogen werden können, ist an Hand dieses kleinen Beispiels ersichtlich: #include <unistd.h>
C: Prozessnamen einer PID unter Linux, HP-UX, MacOS und Solaris ermitteln
In diesem Beispiel zeige ich, wie unter Linux, HP-UX, MacOS und Solaris zu einer Prozess ID der Name des Prozesses ermittelt werden kann. Wiederum die Definition der Funktionen im entsprechenden Header (processname.h): #ifndef PRJ_PROCESSNAME_H #define PRJ_PROCESSNAME_H 1 #define MAX_PROCNAME 1024 #ifdef __cplusplus extern "C" { #endif int prjProcessName(int pid, char *procname); #ifdef __cplusplus } #endif #endif /* !PRJ_PROCESSNAME */ Nach der überschaubaren Headerdatei nun der eigentliche Code in processname.c: Dabei wird an Hand einer Definition entschieden, um welches System es sich handelt. Das sollte natürlich vom configure-Script bestimmt werden, hier in diesem Beispiel aber hartcodiert. #include <stdlib.h> #include <stdio.h> #include
C/C++: Zugriff mehrerer Prozesse auf Shared Memory unter Berücksichtigung des 3rd readers/writers Problems
Im folgenden Listing gehe ich auf den Zugriff auf Shared Memory ein. Dabei soll sichergestellt werden, dass zwei Prozesse, die auf den gemeinsamen Shared Memory zugreifen wollen, sich nicht gegenseitig am Zugriff hindern, die Prozesse also quasi „verhungern“. Siehe hierzu auch zum Beispiel Wikipedia bzw. etwas genauer auf rfc1149.net. Der folgende Teil bezieht sich auf die Semaphoren und den Shared Memory an für sich: Die Header-Datei shmem.h: #ifndef PRJ_SHMEM_H #define PRJ_SHMEM_H 1 #include <prjconfig.h> #define SEMKEYPATH "/opt/prj/sbin/prjd" /* Path used on ftok for semget key */ #define SEMKEYID 1209 /* Id used on ftok for semget key */ #define SHMKEYPATH
C: Passwortabfrage im Terminal
Ich beschreibe hier kurz, wie unter Linux in der Konsole ein Passwort abgefragt werden kann, ohne dass die Eingabe des Users im Terminal erscheint. Hierzu Definitionen im Header-File passphrase.h: #ifndef PRJ_PASSPHRASE_H #define PRJ_PASSPHRASE_H 1 #if defined(__cplusplus) extern "C" { #endif char * prj_read_passphrase(size_t size); int prj_get_passphrase(size_t count, size_t size, char **passphrase); #if defined(__cplusplus) } #endif #endif /* !PRJ_PASSPHRASE_H */ Daraufhin der eigentliche Code in passphrase.c: #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <termios.h> #include "passphrase.h" /* * \brief prj_read_passphrase * * reads from stdin input of user * * \param size maximum length of input * * \return
C: POSIX shared memory objects
Ich liste hier kurz eine Möglichkeit, unter Linux unterschiedlichen Prozessen Zugriff auf gemeinsamen Speicher über das Dateisystem zu geben. Dazu kann man sog. POSIX Shared Memory Objekte verwenden. Es wird mit shm_open() entweder vorhandener Speicher geöffnet oder erstellt. Danach kann man über /dev/shm/[dateiname] auf diesen Speicherbereich zugreifen. Dieser verhält sich wie eine normale Datei. Hier also erst einmal die Headerdatei mmap.h: #ifndef PRJ_MMAP_H #define PRJ_MMAP_H 1 #if defined(__cplusplus) extern "C" { #endif int prj_shm_mmap_create(char const *filename, int readonly); int prj_shm_mmap_write(int shmfd, char const *filecontent, size_t sz); int prj_shm_mmap_remove(char const *filename); #if defined(__cplusplus) } #endif #endif /* !PRJ_SHMEM_H */ Und danach