---
# System prepended metadata

title: 'SR : Révisions'
tags: [sr, '2021']

---

# SR : Révisions
###### tags: `sr` `2021`

###### td, tp: 1
Fork() -> crée un processus fils 
* père : retourne pid du fils
* fils : retourne 0
* erreur : -1

Conserve les variables (descripteurs de fichier, tubes, handler...) au moment du Fork()

wait() -> attend la mort d'un fils
waitpid() -> attend la fin du processus en paramètre

### 1. Fonction exec :

Avec p -> pas besoin de préciser le chemin jusqu'a la commande
Avec v -> passer un tableau d'argument pour la commande
Avec l -> passer chaque argument dans les paramètres de la fonction
Avec e -> passer un tableau de variable d'environnement

### 2. Processus : 

`top` affiche un gestionnaire de tâches avec les ressources allouées.
`ps` affiche les processus en cours.
`getpid()` affiche le numéro de processus qui l'exécute
`getppid()` le pid et ppid n'est pas le même

### 3. Environnement

`env` affiche les variables d'environnement
`export` définir env variable
`unset` supprimer env variable

### 4. Signaux
###### td, tp: 2

#### Type de signaux :

`SIGINT` control-C
`SIGSTOP` suspension d'un proc
`SIGCONT` continuation d'un proc
`SIGKILL` terminaison
`SIGCHILD` fin ou suspension d'un fils signalée au père
`SIGTERM` signal d'arrêt
 
#### Envoie de signaux :

`kill` permet d'envoyer un signal à un pid
si le `pid` précisé est < -1, le signal est envoyé à |gpid|

```c
Kill(-getpid(), SIGTERM);
```
Cette ligne envoie un signal de terminaison à tous les processus du groupe donc tue le père et le fils.

#### Mise en arrière plan :

`control-Z` met en bg un processus en cours
`./ex &` lance un programme en bg
`jobs` affiche les processus en background
`fg %n` met le processus n en premier plan

### 5. Entrées et sorties
###### td, tp: 3

#### Entrée et sorties standards :

*  Entrée : `stdin`
*  Sortie : `stdout`
*  Sortie erreur : `stderr`

#### Redirections :

*  Entrée standard : commande `<` fichier
*  Sortie standard : commande `>` fichier (>> met à la fin du fichier, append)
*  Sortie erreur standard : commande `2>` fichier (le "2" correspond à stderr)

#### Descripteur :

`open` ouvre un fichier et retourne un descripteur de fichier (-1 si échec)
`read` like nbytes dans le descripteur de fichier et le met dans le buffer en paramètre (-1 si échec)
`write` écrit nbyte depuis un buffer dans un descripteur de fichier (-1 si échec, 0 si aucune écriture)

`dup2(oldfd, newfd)` crée une copie de oldfd dans newfd  


#### Tubes : 

Tableau de descripteur de taille 2 :
- fd[0] = sortie du tube, accessible en lecture
- fd[1] = entrée du tube, accessible en écriture

`pipe(fd)` crée le tube de communication

En général, lorsqu'on utilise une des extrémités, on doit fermer l'autre.

### 6. Réseaux
###### td, tp: 5

#### Couches de l'internet :
Couche 1 physique : 
* bits
* wifi/ethernet/fibre/radio/etc.

Couche 2 liaison :
* trame
* organise les transmissions

Couche 3 réseau :
* achemine trame entre 2 hôtes grâce à l'ip

Couche 4 transport : 
* `TCP` transport en mode connecté
* `UDP` transport en mode non connecté

Couche 5 applications :
* Réception du message (ftp, http, dns, etc.)

#### Encapsulation : 
Un trame est composé des headers de chacunes des couches (hors application)
Chaque couche lis son header et peut lire les suivants pour determiner le bon endroit où l'acheminer.

#### Bibliothèque RIO de JANEIRO

##### Tampon rio_t

`rio_t` structure comprenant des infos super cools
`rio_initb` initialise une structure rio_t depuis un descripteur de fichier

```c
#define RIO_BUFSIZE 8192
typedef struct {
    int rio_fd; /* descriptor for this internal buf */
    int rio_cnt; /* unread bytes in internal buf */
    char *rio_bufptr; /* next unread byte in internal buf */
    char rio_buf[RIO_BUFSIZE]; /* internal buffer */
} rio_t;
```
Il est intéressant d'utiliser un tampon rio_t pour savoir le nombre de bytes non lus dans le descripteur de fichier
 
