Système d'exploitation
Cette page explique les bases du fonctionnement d'un système d'exploitation à travers les fonctions système, les processus, les pipes et les sockets.
Fonctions système : read, write, open, close
Ces fonctions sont disponibles via les bibliothèques <unistd.h> et <fcntl.h>. Elles permettent de manipuler des fichiers au niveau bas.
- open(path, flags) : ouvre un fichier et renvoie un descripteur d'entier.
O_RDONLY,O_WRONLY, etc. - read(fd, buffer, size) : lit
sizeoctets depuis le fichierfddans le buffer. - write(fd, buffer, size) : écrit
sizeoctets du buffer vers le fichierfd. - close(fd) : ferme le fichier.
Exemple :
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("fichier.txt", O_RDONLY);
char buf[100];
read(fd, buf, 100);
write(1, buf, 100); // vers stdout
close(fd);
}
Processus et fork()
Un processus est un programme en exécution. On peut en créer un nouveau avec fork().
- pid_t fork() : crée un nouveau processus. Retourne 0 au fils, le PID du fils au parent.
- Chaque processus a son espace mémoire indépendant.
Exemple :
#include <unistd.h>
#include <iostream>
int main() {
pid_t pid = fork();
if (pid == 0) std::cout << "Je suis le fils";
else std::cout << "Je suis le père";
}
On peut ensuite utiliser wait() pour attendre la fin d'un processus fils.
Pipes
Les pipes permettent à deux processus de communiquer entre eux.
- int pipe(fd[2]) : crée deux descripteurs de fichiers, un pour lire, un pour écrire.
Exemple :
#include <unistd.h>
int main() {
int fd[2];
pipe(fd);
if (fork() == 0) {
close(fd[1]);
char buf[20];
read(fd[0], buf, 20);
write(1, buf, 20);
} else {
close(fd[0]);
write(fd[1], "Salut fils", 11);
}
}
Sockets
Les sockets permettent la communication entre deux programmes, souvent via un réseau.
- socket() : crée une socket
- bind(), listen(), accept() : côté serveur
- connect() : côté client
Remarque : ce sujet est souvent introduit dans les projets client/serveur, où un programme accepte des connexions et l'autre envoie des données.