SP-Codeschnipsel Übersicht



Standardfehler:



Todo




Wichtige Header


#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>


String-Manipulation


int strcmp(const char *s1, const char *s2);
// returns 0 if equal, kann nicht fehlschlagen

int strncmp(const char *s1, const char *s2, size_t n);
// wie strcmp, vergleicht aber nur die ersten n Zeichen

size_t strlen(const char *s);
// gibt Länge des String zurück(ohne \0), klappt immer

char* strdup(const char *s):
// allokiert intern Speicher (mittels malloc) und schreibt da die Kopie rein, bei Fehler Null und setzt errno

char *strcpy(char *dest, const char *src);
// Kopiert src in dest, kann nicht fehlschlagen:

char *strcat(char *restrict dst, const char *restrict src);
// Hängt src an dst an (ab dem \0 von dst)

int sprintf(char *restrict str, const char *restrict format, ...);
// Wie fprintf nur wird die Ausgabe in str geschrieben (str muss passend groß sein)

char *strchr(const char *s, int c);
// gibt Pointer zum ersten Auftauchen von c in s zurück, wenn nicht gefunden NULL

strtok(char* str, const char* delim)
// bekommt str und Liste möglicher Trennzeichen(delim). Zerteilt str in einzelne Tokens, die mit Trennzeichen getrennt sind. Beim ersten Aufruf str mitgeben, danach NULL um weiter auf dem selben String zu bleiben. Gibt jedes Mal Pointer zum nächsten Token zurück, am Ende NULL. Zerlegt String dabei also wenn man ihn behalten will kopieren.

strtok_r(char* str, const char* delim, char** saveptr);
// wie strtok aber auch thread safe man muss nur saveptr auf den Stack und mit &saveptr aufrufen

long strtol(const char *restrict nptr, char **restrict endptr, int base);
// Parsed den String nptr in einen long zu einem gegebenen Basis-System (base = 10, für Dezimalsystem). Wenn der String noch andere Zeichen enthält, wird das erste fehlehafte Char in endtr gespeichert.


Multi-Threading


pid_t fork(void);

pid_t wait(int *wstatus);

pid_t waitpid(pid_t pid, int *wstatus, int options);
Status ausgeben

Auf Beendigung eines bestimmten childs warten

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

int pthread_join(pthread_t thread, void **retval);

int pthread_detach(pthread_t thread);


Synchronisation


Atomic
CAS (Nicht-blockierende Synchronisation)


Mutex (Semaphore)


Exec


int execvp(const char *file, char *const argv[]);
int execlp(const char *file, const char *arg, ..., NULL);

int fcntl(int fd, int cmd, ... /* arg */ );


Filestreams


int open(const char *pathname, int flags);

int creat(const char *pathname, mode_t mode);

FILE* fdopen(int filedes, const char *mode):
// gibt File* fuer das den filedes (bspw. ein Socket) zurueck
// mode bspw. "r" (read) oder "w" (write) oder "w+" (beides)

FILE *fopen(const char* pathname, const char* mode); 
//öffnet pathname mit Modus mode(bspw. "r" für reading, "r+" für read and write)
//gibt NULL im Fehlerfall zurück und setzt errno
int fclose(FILE* stream);
// flushes stream und closes the file
// gibt 0 bei Erfolg zurück, sont EOF und setzt errno

int close(int filedes); // wie fclose fuer filedeskriptor

int fileno(FILE *stream);
// returnt die Filedescriptor-Zahl
int fputc(int c, FILE *stream);
int fputs(const char* s, FILE *stream);
// schreibt s in den stream ohne \0, gibt bei Erfolg nonnegative number und bei Fehler EOF zurück, errno wird nicht gesetzt
//Code siehe fputc

int fgetc(FILE *stream);
// liest nächsten  char von stream und gibt ihn als int zurück, oder EOF bei end of file, aber auch im Fehlerfall


char *fgets(char *s, int size, FILE *stream);
// gibt NULL im Fehlerfall und bei end of file zurück
// liest Zeichen von Dateikanal fp in das Feld s bis entweder size-1 Zeichen gelesen wurden oder \n gelesen oder EOF erreicht wurde
// s wird mit \0 abgeschlossen (\n wird nicht entfernt)

int fstat(int fd, struct stat *statbuf);

int lstat(const char *pathname, struct stat *statbuf);
// TODO

int dup(int oldfd);
// sehr oft rx und tx aus einem Filedeskriptor fd
// angenommen man soll nicht sterben sondern nur alle Ressourcen freigeben und -1 returnen

int dup2(int fd, int newfd);
// Schließt newfd und dupliziert fd auf den Wert von newfd, damit lässt sich bspw. stdout in eine Datei umleiten


Directories


DIR *opendir(const char *name);

struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);

Ein ganzes Directory durchgehen:

int scandir(const char *dirp, struct dirent ***namelist, int (*filter)(const struct dirent *), int (*compar)(const struct dirent **, const struct dirent **));
  int alphasort(const struct dirent **a, const struct dirent **b)


Signale


Signal-Handler mit sigaction

Fehlerausgabe auf stderr im Signal-Handler
(perror & fprintf verwenden interne Buffer und dürfen deswegen nicht verwendet werden)

Signal blockieren
Evtl. dazwischen auf Signal warten:
Signal deblockieren


Sockets


Server-Socket


Client-Socket (DNS Anfrage und verbinden mit URL)


Kopien von anderen Aufgaben - TODO einsortieren


Benutzername herausfinden:
und vollen Anmeldenamen:

Status von waitpid überprüfen:

Auf Integer-Overflow prüfen

Shortcut für if(x == NULL) ;