Le carnet On est
Compagnon · révision Programmation Réseau

Deck de flashcards

Toutes les primitives système et patterns C des 6 cours, condensés en cartes. fork/exec/wait, signaux, sémaphores, tubes (pipe/mkfifo), threads pthread, sockets TCP/UDP, files de messages.

~ 55 cartes 6 thèmes Format examen

1. Cours 1 — Introduction et appels système

Aller au chapitre complet ↗

fork()

Retourne quoi dans le père / fils ?

Père : PID du fils (> 0). Fils : 0. Erreur : -1. Le fils est une copie du père.

exec*

Que devient le processus ?

L'image du processus est remplacée par un nouveau programme. Le PID est conservé, mais le code/data/stack changent.

wait vs waitpid

Différence.

wait attend n'importe quel fils. waitpid(pid, status, opts) cible un PID précis et accepte WNOHANG.

Processus zombie

Définition.

Fils terminé dont le père n'a pas encore lu le code de retour. Disparaît au wait() ou à la mort du père (adoption par init).

WIFEXITED / WEXITSTATUS

Usage.

Après wait(&status) : WIFEXITED(status) = vrai si sortie normale, WEXITSTATUS(status) = code de retour (0-255).

getpid / getppid

Que renvoient-ils ?

getpid() = PID du processus courant. getppid() = PID du père.

Trois modes de passage

En C, paramètre d'une fonction.

Valeur (copie), pointeur (adresse), référence (alias). En C : valeur et pointeur uniquement ; référence en C++.

2. Cours 2 — Signaux & sémaphores

Aller au chapitre complet ↗

sigaction

Pourquoi préférer à signal ?

Comportement portable, gestion fine (masque, flags SA_RESTART, SA_SIGINFO). signal a un comportement variable selon Unix.

SIGINT, SIGQUIT, SIGTERM, SIGKILL

Rôles.

SIGINT = Ctrl+C, fin polie. SIGQUIT = Ctrl+\, fin avec core dump. SIGTERM = demande de terminaison. SIGKILL = mort immédiate, ininterceptable.

Ignorer un signal

Comment ?

signal(sig, SIG_IGN) ou sa.sa_handler = SIG_IGN. Inopérant sur SIGKILL et SIGSTOP.

kill

Signature et usage.

int kill(pid_t pid, int sig);. Envoie le signal sig au processus pid. Peut servir à tester l'existence d'un PID avec sig = 0.

Sémaphore

Définition + 2 opérations.

Compteur protégé. P(s) (wait, décrémente, bloque si négatif). V(s) (post, incrémente, débloque).

Primitives POSIX

4 fonctions sémaphores.

sem_init, sem_wait, sem_post, sem_destroy. Inclure <semaphore.h>.

Mutex = sémaphore initial 1

Schéma de section critique.

sem_wait(&mutex) → section critique → sem_post(&mutex). Garantit qu'un seul processus à la fois.

3. Cours 3 — Tubes

Aller au chapitre complet ↗

pipe

Signature et orientation.

int pipe(int p[2]). p[0] = lecture, p[1] = écriture. Mnémonique : 0 = stdin, 1 = stdout.

Tube anonyme vs nommé

Différence clé.

Anonyme (pipe) : pas de nom, lien de parenté requis. Nommé (mkfifo) : nom dans le FS (type p), pas de parenté requise.

Séquence pipe + fork

Ordre canonique.

1. pipe() 2. fork() 3. Chaque processus close() le descripteur inutile 4. read/write 5. close final.

SIGPIPE

Quand est-il envoyé ?

Quand on write sur un tube dont tous les lecteurs sont fermés. Comportement par défaut : fin du processus écrivain.

read sur tube vide

Comportement.

Si écrivains présents : bloquant. Si plus d'écrivain : renvoie 0 (EOF).

dup2(fd, 0)

Effet.

Rediriger stdin : tout read(0, ...) ou scanf lit depuis fd. Pour rediriger stdout : dup2(fd, 1).

mkfifo

Signature et usage shell.

int mkfifo(const char* nom, mode_t mode). Shell : mkfifo /tmp/tube. Apparaît dans ls -l avec type p.

open bloquant sur tube nommé

Pourquoi ?

Mécanisme de rendez-vous : O_RDONLY attend un écrivain, O_WRONLY attend un lecteur. Bypass avec O_NONBLOCK.

4. Cours 4 — Threads POSIX

Aller au chapitre complet ↗

pthread_create

Signature simplifiée.

pthread_create(&tid, attr, fonction, arg). La fonction doit retourner void* et prendre void*.

pthread_join

Rôle.

Attend la fin du thread tid (équivalent de wait pour processus). Récupère sa valeur de retour.

Threads partagent quoi ?

Liste.

Espace d'adressage, variables globales/statiques, descripteurs ouverts, PID. Ne partagent pas : pile, registres, ID de thread.

Mutex POSIX

3 fonctions principales.

pthread_mutex_init, pthread_mutex_lock, pthread_mutex_unlock. Initialisation rapide : PTHREAD_MUTEX_INITIALIZER.

Compilation pthread

Flag obligatoire.

gcc fichier.c -lpthread -o prog (ou -pthread). Sans ça : undefined reference.

Race condition

Définition.

Plusieurs threads accèdent et modifient simultanément une variable partagée. Résultat dépend de l'ordonnancement, imprévisible. Solution : mutex.

Interblocage (deadlock)

Conditions de Coffman.

Exclusion mutuelle + détention + non-préemption + attente circulaire. Solution : toujours acquérir les verrous dans le même ordre.

5. Cours 5 — Sockets TCP/UDP

Aller au chapitre complet ↗

TCP vs UDP

Type de socket.

TCP = SOCK_STREAM, connecté, fiable, ordonné. UDP = SOCK_DGRAM, sans connexion, non fiable.

Séquence serveur TCP

5 appels.

socketbindlistenacceptread/writeclose. accept renvoie un nouveau socket pour le dialogue.

Séquence client TCP

4 appels.

socketconnectwrite/readclose.

Séquence UDP

Côté serveur et client.

Serveur : socket + bind + recvfrom/sendto. Client : socket + sendto/recvfrom (pas de bind nécessaire).

htons / ntohs

Rôle.

Conversion host ↔ network byte order (big-endian) sur 16 bits. À appliquer sur les ports. Variante 32 bits : htonl/ntohl.

inet_aton / inet_ntoa

Sens.

inet_aton : texte « 192.168.1.10 » → binaire in_addr. inet_ntoa : inverse.

INADDR_ANY

Quand l'utiliser ?

Côté serveur, pour bind sur toutes les interfaces locales (loopback, ethernet, wifi…). Évite de hardcoder une IP.

Serveur multi-clients

3 stratégies.

fork après chaque accept (simple). ② pthread par client (léger). ③ select/epoll (mono-thread, scalable).

6. Cours 6 — Files de messages

Aller au chapitre complet ↗

msgget

Rôle.

Crée ou récupère une file de messages identifiée par une clé. IPC_PRIVATE pour une nouvelle file privée.

Structure d'un message

Format obligatoire.

struct msg { long type; char payload[N]; };. Le premier champ doit être un long nommé type (utilisé pour le filtrage).

msgsnd / msgrcv

Filtrage par type.

msgrcv(mq, &m, taille, T, flags) récupère un message avec : T > 0 = type exact, T = 0 = n'importe quel, T < 0 = type ≤ |T|.

msgctl

Usage principal.

msgctl(mq, IPC_RMID, NULL) supprime la file. À faire en fin de programme sinon la file persiste dans le noyau.

Avantage vs pipe

2 différences clés.

① Messages typés (filtrage par type côté lecture). ② Pas besoin de lien de parenté ni de nom dans le FS — clé partagée suffit.

Persistance

Quand la file disparaît ?

Seulement avec msgctl(IPC_RMID) ou redémarrage de la machine. Survit à la mort des processus créateurs.

ipcs / ipcrm

Outils shell.

ipcs -q liste les files. ipcrm -q ID en supprime une. Utile pour nettoyer après un programme buggué.