Beruflich Dokumente
Kultur Dokumente
Bibliothèques statiques
ar rcv maLib.a f2.o f3.o
ranlib maLib.a //index
Equivalent à ar rcvs maLib.a f2.o f3.o
Fichiers header (*.h)
Prototypes (signatures) des fonctions utilisées dans les fi-
chiers *.c. Inclusion dans les fichiers *.c :
#include "f2.h" //repertoire courant
#include <stdlib.h> //librairie standard
Définir des variables :
#ifndef PI
#define PI 3.14
#endif
x = PI // x = 3.14
Etats d’un processus : Création d’un processus
Processus UNIX pid_t fork(void);
— Elu (running) : instructions du processus sont en
Définition. Correspond à l’exécution d’un programme bi- train d’être exécutées ; Permet la création dynamique d’un nouveau processus
naire caractérisé par : fils qui s’exécute de façon concurrente avec le processus
— Bloqué (waiting) : processus en attente d’une res- père qui l’a créé. Le processus fils créé est une copie du
source, en suspension ; processus père.
— Numéro unique : pid ; — Prêt (ready) : processus en attente d’être affecté au Valeur de retour :
processeur ; — -1 : erreur dans errno :
— Utilisateur propriétaire : uid ; — Terminé (zombie) : processus fini, mais son père n’a . ENOMEM : plus de mémoire disponible ;
pas pris connaissance de sa terminaison.
. EAGAIN : trop de processus créés.
pid_t getpid(void);
— Groupe de l’utilisateur propriétaire : gid ; — 0 : renvoyé au fils créé (pid du père : getpid) ;
Retourne le pid du processus courant
pid_t getppid(void); — pid du processus fils : renvoyé au père.
— Répertoire courant ; Retourne le pid du père du processus courant void exit(int status);
Un processus est lié à un utilisateur (UID : uid_t) et à son Terminaison d’un processus :
— Contexte d’exécution : groupe (GID : gid_t) :
— status : valeur récupérée par le processus père
— Réel : droits associés à l’utilisateur/groupe qui (disponible dans le shell avec $?) ;
lance le programme :
. text : code ; — Utilisation des constantes :
. uid_t getuid(void); (setuid)
. EXIT_SUCCESS = 0 ;
. gid_t getgid(void); (seteuid)
. data : données initialisées ; . EXIT_FAILURE 6= 0.
— Effectif : droits associés au programme lui-même :
int atexit(void (* function(void)));
. bss : données non initialisées ; . uid_t geteuid(void); (setgid) Insérer la fonction function en tête de la pile des fonc-
. gid_t getegid(void); (setegid) tions invoquées à la fin du programme.
Terminaison d’un processus (exit ou return) :
. heap (tas) : variables globales + malloc ;
— Toutes les fonctions enregistrées avec atexit() sont
appelées (dépilées) ;
. stack (pile) : variables locales, paramètres ;
— Fermeture des flux E/S (buffers vidés) ;
. U-area : argv[], envp[]. . . — Appel à _exit() – appel système :
. Ferme les descripteurs de fichiers ouverts ;
. Processus père reçoit le signal SIGCHLD.
Allocation dynamique de mémoire — Le processus devient zombie.
#include <stdlib.h>
void * malloc(size_t size);
Alloue bloc de size octets
void * calloc(size_t nb, size_t size);
Alloue un bloc de nb*size octets initialisés à 0
void * realloc(void * ptr, size_t size);
Redimensionne un bloc mémoire (conserve son contenu)
void free(void * ptr);
Libère la mémoire allouée
int brk(void *ptrFin);
positionne la fin du tas à l’adresse ptrFin
void * sbrk(intptr_t inc);
Incrémente le tas de inc octets et retourne l’emplace-
ment de la limite modifiée.
Synchronisation simple
Transmission de paramètres :
pid_t wait(int * status);
Synchronisation père/fils : — p : exécutable recherché dans le PATH ;
— Le processus a au moins un fils zombie : — e : prend en paramètre un nouvel environnement.
. Retourne : le pid de l’un de ses fils zombie ; Erreurs (errno) :
. status : informations sur le fils zombie. — EACCES : pas de permission d’accès au fichier ;
— Le processus a des fils qui ne sont pas à l’état — ENOENT : fichier n’a pas été trouvé.
zombie. Le processus est bloqué jusqu’à ce que : int execl (const char *path, const char *arg, ...)
. L’un de ses fils devienne zombie ; int execlp(const char *file, const char *arg, ...)
int execle(const char *path, const char *arg, ...,
. Il reçoive un signal. char * const envp[])
— Le processus ne possède pas de fils : retourne -1
et errno = ECHILD int execv (const char *path, char * const argv[])
Rem. Pour attendre un fils en particulier : waitpid() int execvp(const char *file, char * const argv[])
Macros pour la valeur de retour status : int execve(const char *path, char * const argv[],
char * const envp[])
— WIFEXITED : non NULL si terminé normalement ;
Autres fonctions
— WEXITEDSTATUS : code de retour si terminé norma-
int system(const char *command);
lement ;
Invoque le shell en lui transmettant la fonction passée
— WIFSIGNALED : non NULL si terminé à cause d’un en paramètre :
signal ;
— fork() et le fils lance la commande ;
— WTERMSIG : num. signal ayant terminé le proces-
— Le père attend le fils.
sus ;
pid_t vfork(void);
— WIFSTOPPED : non NULL si processus fils stoppé ;
Idem fork, mais le segment de données n’est pas du-
— WSTOPSIG : num. signal ayant stoppé le processus. pliqué. Le processus fils travaille sur les données de son
pid_t waitpid(pid_t pid, int * status, int opt) père ⇒ Bloquer le père en attente du fils.
Tester la terminaison d’un processus fils d’identité pid int setjmp(jmp_buf env);
ou du groupe |pid| : Permet de sauvegarder l’état du programme dans env
— Valeur de retour : du type jmp_buf :
. -1 : erreur ; — Premier appel : 0 ;
. 0 : processus non terminé (mode non blo- — Appel issu d’un longjmp : valeur de lonjmp.
quant) ; void longjmp(jmp_buf env, int val);
. pid du processus terminé. Remet le programme dans l’état sauvegardé par le der-
nier appel à setjmp par rapport à la variable env.
— Paramètre pid :
. > 0 : processus fils ;
. 0 : processus fils qcq (même groupe appe-
lant) ;
. -1 : processus fils qcq ;
. < -1 : processus fils qcq du groupe |pid|.
— Paramètre opt :
. WNOHANG : appel non bloquant ;
. WUNTRACED : retourne si le processus est
stoppé.
Accès
ssize_t mq_receive(mqd_t mqdes, char *msg_ptr,
Segment de mémoire partagée – <sys/mman.h> . PROT_WRITE : écriture autorisée ;
size_t msg_len, unsigned *msg_prio);
Fonctions contenues dans librt (-lrt en fin de gcc).
Supprime le plus vieux message avec la plus grande prio-
rité de la file de message référencée par mqdes et le place Principe. Zone de mémoire attachée a un processus, mais . PROT_NONE : les pages ne peuvent pas être
dans le tampon pointé par msg_ptr. accessible pour d’autres processus. accédées.
— msg_ptr : pointeur sur le tampon du message à Zone mémoire associée au file mapping : établissement
recevoir ; d’une correspondance (attachement) entre un fichier (seg-
Ne doit pas entrer en conflit avec le mode d’ou-
ment mémoire) et une partie de l’adressage d’un processus
— msg_len : taille du message à recevoir (> verture du fichier (ou autre objet) ;
réservé à cet effet.
mq_msgsize de la file) ; Le descripteur de segment pointe sur la mémoire physique,
— msg_prio : si msg_prio != NULL tampon pour mappé dans l’espace d’adressage de plusieurs processus. — flags : type de fichier (ou autre objet) projet, les
renvoyer la priorité associée au message reçu ; options de projection, et si les modifications faites
Avantages / inconvénients :
sur la portion projetée sont privées ou doivent être
— Valeur de retour : 0 si succès, -1 si échec (errno). • Accès totalement libre ; partagées avec les autres références :
Appel bloquant si la file est vide et O_NONBLOCK non • Pas de recopie mémoire (écriture directement sur le
spécifié. système) ;
mqd_t mq_notify(mqd_t mqdes, const struct . MAP_SHARED : partager la projection avec
• Accès totalement libre : la synchronisation doit être tout autre processus utilisant le fichier (ou
sigevent *notification); explicite par les sémaphores ou signaux ;
Permet au processus appelant de s’enregistrer ou se autre objet). Ecriture dans la zone ⇔ Ecri-
désenregistrer de la délivrance d’une notification asyn- • Pas de gestion de l’adressage : validité d’un poin- ture dans le fichier (maj avec msync() ou
chrone (non bloquant) lorsqu’un nouveau message ar- teur limitée à son espace d’adressage ⇒ Impossible mumap()) ;
rive sur une file de messages vide référencée par le des- de partager pointeurs entre processus.
cripteur mqdes. . MAP_PRIVATE : projection privée (shadow
Accès copy). Les modifications seront visibles uni-
— notification : pointeur sur struct sigevent ; int shm_open(const char *name, int oflag, mode_t
mode); quement par le processus appelant. L’écri-
— Valeur de retour : 0 si succès, -1 si échec (errno). ture dans la zone ne modifie pas le fichier ;
Crée et ouvre un nouvel objet de mémoire partagé PO-
Un seul processus par file peut demander à être notifié. SIX name de taille 0, ou ouvre un objet existant.
Une notification est émise si aucun processus n’est blo- . MAP_FIXED : n’utiliser que l’adresse start in-
— oflags : idem fonction open ;
qué en attente de message. A près notification, désenre- diquée ;
gistrement de la demande ⇒ notification à chaque arri- — mode : idem fonction chmod ;
vée de message : refaire un appel à chaque notification. — Valeur de retour : descripteur de fichier non nul. . MAP_ANONYMOUS : la projection n’est pas
union sigval { /* Data passed with notif. */ Si échec, -1 (errno). contenue dans un fichier. Les champs fd et
int sival_int; /* Integer value */ int shm_unlink(const char *name); offset sont ignorés (fd = -1).
void *sival_ptr; /* Pointer value */ Supprime l’objet name créé par shm_open(). supprime
}; le nom d’un objet de mémoire partagée, et, une fois
struct sigevent { que tous les processus ont supprimé leur projection en — fd : descripteur de fichier valide ;
int sigev_notify; /* Notif. method : mémoire, libère et détruit le contenu du segment mé-
SIGEV_NONE, SIGEV_SIGNAL, SIGEV_THREAD */ moire. Après un appel réussi à shm_unlink(), les tenta- — offset : normalement multiple de la taille de page
int sigev_signo; /* Notif. signal */ tives d’appeler shm_open() avec le même nom échoue- renvoyée par getpagesize() ;
union sigval sigev_value; /* Data passed with ront (sauf si O_CREAT est spécifié, auquel cas un nouvel
notif. */ objet distinct est créé). — Valeur de retour : pointeur sur la zone mémoire
void (*sigev_notify_function) (union sigval); si succès, sinon MAP_FAILED (ie. (void *)-1) et
/* Function for thread notif. */ — Valeur de retour : 0 si succès, -1 sinon (errno).
errno.
void *sigev_notify_attributes; /* Thread void *mmap(void *start, size_t length, int prot,
function attributes */ int flags, int fd, off_t offset); int munmap(void *start, size_t length);
}; Demande la projection en mémoire de length octets Détruit la projection de taille length dans la zone de
commençant à la position offset depuis un ficher (ou mémoire spécifiée à l’adresse start. Toute référence
autre objet) référencé par le descripteur fd, de préfé- ultérieure à cette zone mémoire déclenche une erreur
rence à l’adresse pointée par start (généralement 0). d’adressage (SIGSEGV).
La véritable adresse où l’objet est projeté est renvoyée — start : doit être un multiple de la taille de page.
par la fonction elle-même. Toutes les pages contenant une partie de l’inter-
— start : adresse où attacher le segment en mémoire valle indiqué sont libérées ;
(0 : choix du système) ; — Valeur de retour : 0 si succès, -1 sinon (errno).
— prot : protection souhaitée pour la zone mémoire : Projection automatiquement détruite lors de la termi-
. PROT_EXEC : exécution de code autorisée ; naison du processus. La fermeture du descripteur de fi-
. PRO_READ : lecture autorisée ; chier ne supprime pas la projection.
Opérations sur un segment Sémaphores – <semaphore.h> Sémaphore nommé
int mprotect(const void *addr, size_t *len, int Principe (Dijkstra). Mécanisme de synchronisation pour sem_t *sem_open(const char *name, int oflag);
prot); l’accès à la mémoire partagée du fait des accès concurrents sem_t *sem_open(const char *name, int oflag,
Spécifie la protection souhaitée pour la/les page(s) à une ressource partagée. Solution au problème de l’exclu- mode_t mode, unsigned int value);
contant tout/une partie de l’intervalle [addr, addr+len sion mutuelle (cas d’un accès critique à une ressource). Crée un nouveau sémaphore POSIX ou en ouvre un exis-
-1]. Structure sémaphore : tant identifié par name.
— prot : OU binaire entre les valeurs PROT_NONE, — Compteur : nombre d’accès disponibles avant blo- — oflag, mode : idem fonction open() ;
PROT_READ, PROT_WRITE, PROT_EXEC ; cage ; — value : valeur initiale du compteur du sémaphore ;
— Valeur de retour : 0 si succès, -1 sinon (errno). — File d’attente : processus bloqués en attente d’un — Valeur de retour : pointeur sur le sémaphore si
La nouvelle protection remplace toute autre protection accès. succès, SEM_FAILED si échec (errno).
précédente. Si un accès interdit s produit, le programme Fonctionnent. int sem_close(sem_t *sem);
reçoit le signal SIGSEGV. Ferme le sémaphore nommé référencé par sem. Désalloue
int ftruncate(int fd, off_t length); — Demande d’accès : P – proberen (“Puis-je ?”) :
les ressources que le système avait alloué au processus
Tronque le fichier (ou autre objet) référencé par le des- . Décrémentation du compteur ; appelant pour ce sémaphore.
cripteur fd à une longueur maximale de length octets. . Si compteur < 0, alors blocage du processus
Permet d’allouer une taille à un segment de mémoire. — Valeur de retour : 0 si succès, -1 sinon (errno).
et insertion dans la file.
L’objet doit être ouvert en écriture. int sem_unlink(const char *name);
— Fin d’accès : V – verhogen (“Vas-y”) : Supprime un sémaphore nommé référencé par name. Le
— Si l’objet était plus long, les données supplémen-
taires sont perdues ; . Incrémentation du compteur ; nom du sémaphore est immédiatement supprimé. Le sé-
. Si compteur 6 0, déblocage d’un processus de maphore est détruit une fois que tous les autres proces-
— Si l’objet était plus cours, il est étendu et la por- sus qui l’avait ouvert l’ont fermé.
tion supplémentaire est remplie d’octets nuls. la file.
Blocage, déblocage et insertion de processus dans la file — Valeur de retour : 0 si succès, -1 sinon (errno).
— Valeur de retour : 0 si succès, -1 sinon (errno).
sont des opérations implicites.
int msync(const void *start, size_t length, int
flags); Interblocage. Deux processus P et Q sont bloqués en at-
Met à jour le segment associé à la projection start de tentes : P attend que Q signale sa fin d’accès et Q attend
taille length. que P signale sa fin d’accès.
Famine. Un processus est bloqué en attente d’une fin d’ac-
— flags : comprend les bits :
cès qui n’arrivera jamais.
. MS_ASYNC : demande une maj immédiate non Deux types de sémaphores :
bloquante ;
— Sémaphores anonymes : processus avec filiation
. MS_SYNC : demande une maj immédiate blo- (seulement threads sur Linux) ;
quante ;
— Sémaphores nommés : tous les processus de la ma-
. MS_INVALIDATE : demande la désactivation chine.
de toutes les autres projections du même fi-
chier (ou autre objet), afin qu’elles soient
remises à jour avec les nouvelles données
écrites.
Les flags MS_ASYNC et MS_SYNC ne peuvent pas être
utilisés conjointement.
— Valeur de retour : 0 si succès, -1 sinon (errno).
Sémaphore anonyme
int sem_init(sem_t *sem, int pshared, unsigned
int value);
Initialise le sémaphore anonyme situé à l’adresse pointée
par sem.
— pshared : indique si ce sémaphore sera partagé
entre les threads d’un processus ou entre proces-
sus :
. Si pshared = 0, le sémaphore est partagé
entre les threads d’un processus et devra être
situé à une adresse visible par ces derniers ;
. Si pshared != 0, le sémaphore est partagé
entre processus et devrait être situé dans une
zone de mémoire partagée (shm_open).
— value : valeur initiale du sémaphore ;
— Valeur de retour : 0 si succès, -1 sinon (errno).
int sem_destroy(sem_t *sem);
Détruit le sémaphore anonyme situé à l’adresse pointée
par sem. Seul un sémaphore initialisé avec sem_init()
peut être détruit avec sem_destroy().
— Valeur de retour : 0 si succès, -1 sinon (errno).
partagée (en cas de réduction du segment de mémoire bss Données non intialisées
teurs de structures (la structure pointée ne se trouve pas _end
partagé, seul le surplus est détruit) ; dans la mémoire partagée, contrairement au pointeur). heap Allocation dynamique (malloc)
sbrk()
3. mmap() : mapper le segment de mémoire partagée dans
l’espace d’adressage du processus. Exécution (appels de fonction,
PILE PILE stack variables locales, paramètres, ...)
// CLIENT }
//Ouverture du shm cree par le serveur Emplacement des sémaphores et segments de mé- Compteur
Mode Offset
Pointeur Nombre
de références sur i-node d'ouvertures
if((fd_shm = shm_open(shm_name, O_RDWR, 0600)) moire partagée
== -1) { Placés dans le répertoire /dev/shm dans les distributions
perror("shm_open error"); Linux.
exit(EXIT_FAILURE); Synchronisation sans sémaphores
} Différents états d’un processus Utilisation d’un anneau où un signal part de la source et
se propage jusqu’à atteindre la source. Il est impossible de
//Mapping du shm ouvert compter le nombre de signaux qui arrivent à la source.
Création Prêt
if((sp = mmap(NULL, sizeof(struct shm_data), Problème de performance : plus de parallélisme.
PROT_READ|PROT_WRITE, MAP_SHARED, fd_shm,
Réveil (fin E/S) Fin quantum SIGNAUX
0)) == MAP_FAILED) { Élection S
perror("mmap error");
exit(EXIT_FAILURE);
Bloqué Élu Fin
}
Blocage (E/S)
ERRNO ERRORS
Fichier /usr/include/asm-generic/errno-base.h #define ENOTEMPTY 39 /* Directory not empty */
#define ELOOP 40 /* Too many symbolic links encountered */
#ifndef _ASM_GENERIC_ERRNO_BASE_H #define EWOULDBLOCK EAGAIN /* Operation would block */
#define _ASM_GENERIC_ERRNO_BASE_H #define ENOMSG 42 /* No message of desired type */
#define EIDRM 43 /* Identifier removed */
#define EPERM 1 /* Operation not permitted */ #define ECHRNG 44 /* Channel number out of range */
#define ENOENT 2 /* No such file or directory */ #define EL2NSYNC 45 /* Level 2 not synchronized */
#define ESRCH 3 /* No such process */ #define EL3HLT 46 /* Level 3 halted */
#define EINTR 4 /* Interrupted system call */ #define EL3RST 47 /* Level 3 reset */
#define EIO 5 /* I/O error */ #define ELNRNG 48 /* Link number out of range */
#define ENXIO 6 /* No such device or address */ #define EUNATCH 49 /* Protocol driver not attached */
#define E2BIG 7 /* Argument list too long */ #define ENOCSI 50 /* No CSI structure available */
#define ENOEXEC 8 /* Exec format error */ #define EL2HLT 51 /* Level 2 halted */
#define EBADF 9 /* Bad file number */ #define EBADE 52 /* Invalid exchange */
#define ECHILD 10 /* No child processes */ #define EBADR 53 /* Invalid request descriptor */
#define EAGAIN 11 /* Try again */ #define EXFULL 54 /* Exchange full */
#define ENOMEM 12 /* Out of memory */ #define ENOANO 55 /* No anode */
#define EACCES 13 /* Permission denied */ #define EBADRQC 56 /* Invalid request code */
#define EFAULT 14 /* Bad address */ #define EBADSLT 57 /* Invalid slot */
#define ENOTBLK 15 /* Block device required */
#define EBUSY 16 /* Device or resource busy */ #define EDEADLOCK EDEADLK
#define EEXIST 17 /* File exists */
#define EXDEV 18 /* Cross-device link */ #define EBFONT 59 /* Bad font file format */
#define ENODEV 19 /* No such device */ #define ENOSTR 60 /* Device not a stream */
#define ENOTDIR 20 /* Not a directory */ #define ENODATA 61 /* No data available */
#define EISDIR 21 /* Is a directory */ #define ETIME 62 /* Timer expired */
#define EINVAL 22 /* Invalid argument */ #define ENOSR 63 /* Out of streams resources */
#define ENFILE 23 /* File table overflow */ #define ENONET 64 /* Machine is not on the network */
#define EMFILE 24 /* Too many open files */ #define ENOPKG 65 /* Package not installed */
#define ENOTTY 25 /* Not a typewriter */ #define EREMOTE 66 /* Object is remote */
#define ETXTBSY 26 /* Text file busy */ #define ENOLINK 67 /* Link has been severed */
#define EFBIG 27 /* File too large */ #define EADV 68 /* Advertise error */
#define ENOSPC 28 /* No space left on device */ #define ESRMNT 69 /* Srmount error */
#define ESPIPE 29 /* Illegal seek */ #define ECOMM 70 /* Communication error on send */
#define EROFS 30 /* Read-only file system */ #define EPROTO 71 /* Protocol error */
#define EMLINK 31 /* Too many links */ #define EMULTIHOP 72 /* Multihop attempted */
#define EPIPE 32 /* Broken pipe */ #define EDOTDOT 73 /* RFS specific error */
#define EDOM 33 /* Math argument out of domain of func */ #define EBADMSG 74 /* Not a data message */
#define ERANGE 34 /* Math result not representable */ #define EOVERFLOW 75 /* Value too large for defined data type */
#define ENOTUNIQ 76 /* Name not unique on network */
#endif #define EBADFD 77 /* File descriptor in bad state */
#define EREMCHG 78 /* Remote address changed */
#define ELIBACC 79 /* Can not access a needed shared library */
Fichier /usr/include/asm-generic/errno.h #define ELIBBAD 80 /* Accessing a corrupted shared library */
#define ELIBSCN 81 /* .lib section in a.out corrupted */
#ifndef _ASM_GENERIC_ERRNO_H #define ELIBMAX 82 /* Attempting to link in too many shared libraries */
#define _ASM_GENERIC_ERRNO_H #define ELIBEXEC 83 /* Cannot exec a shared library directly */
#define EILSEQ 84 /* Illegal byte sequence */
#include <asm-generic/errno-base.h> #define ERESTART 85 /* Interrupted system call should be restarted */
#define ESTRPIPE 86 /* Streams pipe error */
#define EDEADLK 35 /* Resource deadlock would occur */ #define EUSERS 87 /* Too many users */
#define ENAMETOOLONG 36 /* File name too long */ #define ENOTSOCK 88 /* Socket operation on non-socket */
#define ENOLCK 37 /* No record locks available */ #define EDESTADDRREQ 89 /* Destination address required */
#define ENOSYS 38 /* Function not implemented */ #define EMSGSIZE 90 /* Message too long */
#define EPROTOTYPE 91 /* Protocol wrong type for socket */ #define EALREADY 114 /* Operation already in progress */
#define ENOPROTOOPT 92 /* Protocol not available */ #define EINPROGRESS 115 /* Operation now in progress */
#define EPROTONOSUPPORT 93 /* Protocol not supported */ #define ESTALE 116 /* Stale NFS file handle */
#define ESOCKTNOSUPPORT 94 /* Socket type not supported */ #define EUCLEAN 117 /* Structure needs cleaning */
#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ #define ENOTNAM 118 /* Not a XENIX named type file */
#define EPFNOSUPPORT 96 /* Protocol family not supported */ #define ENAVAIL 119 /* No XENIX semaphores available */
#define EAFNOSUPPORT 97 /* Address family not supported by protocol */ #define EISNAM 120 /* Is a named type file */
#define EADDRINUSE 98 /* Address already in use */ #define EREMOTEIO 121 /* Remote I/O error */
#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ #define EDQUOT 122 /* Quota exceeded */
#define ENETDOWN 100 /* Network is down */
#define ENETUNREACH 101 /* Network is unreachable */ #define ENOMEDIUM 123 /* No medium found */
#define ENETRESET 102 /* Network dropped connection because of reset */ #define EMEDIUMTYPE 124 /* Wrong medium type */
#define ECONNABORTED 103 /* Software caused connection abort */ #define ECANCELED 125 /* Operation Canceled */
#define ECONNRESET 104 /* Connection reset by peer */ #define ENOKEY 126 /* Required key not available */
#define ENOBUFS 105 /* No buffer space available */ #define EKEYEXPIRED 127 /* Key has expired */
#define EISCONN 106 /* Transport endpoint is already connected */ #define EKEYREVOKED 128 /* Key has been revoked */
#define ENOTCONN 107 /* Transport endpoint is not connected */ #define EKEYREJECTED 129 /* Key was rejected by service */
#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
#define ETOOMANYREFS 109 /* Too many references: cannot splice */ /* for robust mutexes */
#define ETIMEDOUT 110 /* Connection timed out */ #define EOWNERDEAD 130 /* Owner died */
#define ECONNREFUSED 111 /* Connection refused */ #define ENOTRECOVERABLE 131 /* State not recoverable */
#define EHOSTDOWN 112 /* Host is down */
#define EHOSTUNREACH 113 /* No route to host */ #endif