processus et redirections - trolen.polytech.unice.frtrolen.polytech.unice.fr/cours/progsys/cours/06...

29
Processus et Redirections (*) Cours réalisé grâce aux documents de : Stéphane Lavirotte, Jean-Paul Rigault Mail: [email protected] Web: http://stephane.lavirotte.com/ Université de Nice - Sophia Antipolis Présentation: Stéphane Lavirotte Auteurs: … et al*

Upload: phamduong

Post on 12-Sep-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

Processus et Redirections

(*) Cours réalisé grâce aux documents de :Stéphane Lavirotte, Jean-Paul Rigault

Mail: [email protected]

Web: http://stephane.lavirotte.com/

Université de Nice - Sophia Antipolis

Présentation: Stéphane LavirotteAuteurs: … et al*

Quelques Rappels

Redirection des Flux d’Entrée-Sorties

Présentation: S. Lavirotte – Auteurs : … et al* 2

Les Redirections en Shell

17/10/2016 Stéphane Lavirotte 3

Chaque programme a des canaux de communication par défaut:– 0: Entrée standard (par défaut clavier)

– 1: Sortie standard (par défaut le terminal, donc écran)

– 2: Sortie standard d’erreur (par défaut le terminal, donc écran)

Il est possible de rediriger ces canaux de communication– Vers ou bien à partir d’un fichier (<, >, >>)

– Vers un autre canal du même programme (>&)

– Vers le canal d’un autre programme (|)

Si on ne spécifie pas de numéro avec la redirection > ou >> c’est le canal 1 qui est celui par défaut

Les Redirections en ImagesVers des Fichiers

17/10/2016 Stéphane Lavirotte 4

Commande

01

2

Commande

01

2

Comportement normal de toute commande

Commande

01

2

commande < file.txt

file.txt

commande > file.txt

file.txt

Commande

01

2file.txt

commande 2> file.txt

Quel est le résultat de la commande suivante ?

1. Lit les données dans file1.txt et écrit les résultats dans file2.txt

2. Ecrit les résultats dans file2.txt

3. Lit les données dans file1.txt

4. J’obtiens une erreur quand j’exécute cette commande

17/10/2016 Stéphane Lavirotte 5

Soit l’exécution suivante :file1.txt < mon_script.sh > file2.txt

Que fait ce script avec ces deux redirections ?

Présentateur
Commentaires de présentation
On obtient une erreur. Ce que l’on a vu dès la premier cours reste toujours valable. Pour exécuter une commande, l’ordre est: nom de la commande, options, arguments puis les redirections possible en lecture ou en écriture. Donc j’obtiendrai une erreur. Réponse 4

Quelle commande permet de remplir le contenu d’un fichier à partir du

clavier ?1. cat > file.txt

2. < cat > file.txt

3. > file.txt cat

4. > cat file.txt

5. cat < file.txt

17/10/2016 Stéphane Lavirotte 6

Présentateur
Commentaires de présentation
Les réponses 2, 3 et 4 ne peuvent pas convenir car elles ne commencent pas par la commande, mais par la direction. La réponse 5 lirait les données non à partir du clavier mais à partir du fichier file.txt (ce qui n’est pas ce que l’on souhaite). Donc la réponse est 1.

Les Redirections en ImagesVers des Canaux

17/10/2016 Stéphane Lavirotte 7

Commande

01

2

Commande 1

01

2

commande 2>&1

commande1 | commande2

Commande 2

01

2

Commande

01

2

commande 1>&2

|

Que fait la redirection suivante ?

1. Message 12. Message 1 Message 23. Message 2

4. Rien

17/10/2016 Stéphane Lavirotte 8

Soit le script mon_script.sh:#!/bin/bash

echo –n "Message 1 "

echo "Message 2" >&2

et l’exécution suivante:mon_script.sh > file.txt

Que contient le fichier file.txt ?

Présentateur
Commentaires de présentation
Le script envoi le premier message sur la sortie standard et le deuxième message sur la sortie standard d’erreur (on redirige le canal de la sortie standard sur la sortie standard d’erreur). Quand on exécute le script, on redirige le canal 1 (la sortie standard) vers le fichier file.txt. Donc le fichier file.txt contiendra « Message 1 ». Réponse 1

Que fait la redirection suivante ?

1. Message 12. Message 1 Message 23. Message 2

4. Rien

17/10/2016 Stéphane Lavirotte 9

Soit le script mon_script.sh:#!/bin/bash

echo –n "Message 1 "

echo "Message 2" >&2

et l’exécution suivante:mon_script.sh 2>&1 > file.txt

Que contient le fichier file.txt ?

Présentateur
Commentaires de présentation
Le script envoi le premier message sur la sortie standard et le deuxième message sur la sortie standard d’erreur (on redirige le canal de la sortie standard sur la sortie standard d’erreur). Quand on exécute le script, on redirige le canal 2 (la sortie standard d’erreur) vers le canal 1 PUIS le canal 2 vers le fichier file.txt. Donc au moment où on branche le canal 2 vers le canal 1, le canal 1 n’est pas redirigé vers le fichier. Conclusion, l’ordre des redirections est important. Donc le fichier file.txt contiendra uniquement « Message 1 ». Réponse 1. Pour la réponse 2 (contient les 2 messages), il aurait fallu écrire la commande: mon_script.sh > file.txt 2>&1

Que fait l’enchainement de commandes suivantes ?

1. user1 user22. 10 103. /home/user2 /home/user14. /home/user1 /home/user25. /bin/bash /bin/bash6. /bin/bash

17/10/2016 Stéphane Lavirotte 10

Soit le fichier /etc/passwd suivant:user2:x:11:21::/home/user2:/bin/bashuser1:x:10:10::/home/user1:/bin/bash

et l’exécution de commandes suivantes:cat /etc/passwd | cut –d ":" –f 6 | sort | uniq

Qu’est ce qui sera affiché ?

Présentateur
Commentaires de présentation
La suite de commande lit le contenu du fichier (commande cat) qui est envoyé dans la commande cut pour ne récupérer que le 6ème champ en découpant suivant l’espace, le résultat étant envoyé dans la commande de tri et ne retenir que qu’une instance s’il y a des répétition. La commande cut récupérant le 6ème champ avec un découpage sur le :, c’est le champ contenant les dossiers personnels des utilisateurs qui est conservé puis trié par ordre alphanumérique. Donc il s’affichera /home/user1 /home/user2. Réponse 4

Des suites de commandes pour « tout faire »!

Des traitements complexes peuvent être réalisés grâce à la redirections de flux de données– Compter le nombre de fichiers (ou dossiers) à partir d’un

dossier ls –alR /etc | grep '^-' | wc –l

– Créer la liste des utilisateurs (ou des groupes) de votre machine cat /etc/passwd | cut –d ":" -f 1 | sort

– Connaître le nombre de comptes qui ont bien un mot de passe sudo cat /etc/shadow | cut –d ":" -f 2 | grep –v "^[^*!]$" | wc -l

– Compter le nombre de mots dans un document cat untexte.txt | tr '[:punct:]' '\n' | tr -d '[ \t]' | grep -v "^$" | sort | uniq -c

17/10/2016 Stéphane Lavirotte 11

Résultats

Si vous avez– 5 bonnes réponses: Vous savez tout sur les redirections. Bravo!

– 4 bonnes réponses: Pas mal, vous avez des connaissances solides

– ≤ 3 bonnes réponses: Il y a des choses à revoir

Pour améliorer vos connaissances et votre pratique sur les redirections:

– http://stephane.lavirotte.com/teach/cours/envinfo1/08-09 Redirections.pdf

Ce sont des connaissances qui doivent être maîtrisées avant d’étudier comment programmer les redirections

Stéphane Lavirotte 12

Mise en œuvre sous Posix C

(une descente sous la surface des choses)

Processus et Redirections

Stéphane Lavirotte 13

Contrôle des Opérations sur Fichier

Permet de réaliser des opérations sur les descripteurs de fichiers

#include <unistd.h>#include <fcntl>

int fcntl(int fd, int cmd, ...);

Le nombre de paramètres dépend de cmd Commandes (cmd)

– F_DUPFD duplique le descripteur (voir diapo suivante)– F_GETFL consulte indicateurs de open()– F_GETLK consulte état verrouillage– F_SETFL modifie indicateurs de open()– F_SETLK ou F_SETLWK modifie état verrouillage– etc.

Présentation: S. Lavirotte – Auteurs : … et al* 14

Duplication de descripteurs1/2

Duplication de descripteurint newfd = fcntl(fd, F_DUPFD, minfd);

– fd et newfd sont synonymes ; ils désignent le même fichier, avec le même pointeur d’E/S

Fonctions spéciales de duplicationint newfd = dup(fd);

– équivalent à newfd = fcntl(fd, F_DUPFD, 0);

int newfd = dup2(fd, desiredfd);

– équivalent à:close(desiredfd);

newfd = fcntl(fd, F_DUPFD, desiredfd);

Présentation: S. Lavirotte – Auteurs : … et al* 15

Présentateur
Commentaires de présentation
The dup() system call creates a copy of the file descriptor oldfd, using the lowest-numbered unused descriptor for the new descriptor. The dup2() system call performs the same task as dup(), but instead of using the lowest-numbered unused file descriptor, it uses the descriptor number specified in newfd. If the descriptor newfd was previously open, it is silently closed before being reused.

Duplication de descripteurs2/2

Exemple de duplication de descripteur :– Redirections du Shell

$ ls > foo

int fd = open("foo",O_WRONLY|O_CREAT|O_TRUNC,

S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);

dup2(fd, 1);

close(fd);

Présentation: S. Lavirotte – Auteurs : … et al* 16

#include <unistd.h>

int pipe(int fds[2]);

Flot non structuré de caractères

Gestion FIFO (First In, First Out)

Synchronisation producteur/consommateur– write() peut être bloquant (read() aussi, bien sûr !)

Communication de Données entre Processus: Tube – pipe() 1/3

Présentation: S. Lavirotte – Auteurs : … et al* 17

fds[1] fds[0]

Communication de Données entre Processus: Tube – pipe() 2/3

Plusieurs processus peuvent se partager les deux extrémités du pipe– Atomicité des lectures et écritures de moins de PIPE_BUF

caractères

– Aucune structure des E/S n'est conservée dans le pipe

Conditions aux limites– Si aucun processus n'a le pipe ouvert en écriture, une tentative

de lecture reçoit une fin de fichier (EOF)

– Si aucun processus n'a le pipe ouvert en lecture, un processus tentant d'écrire recevra le signal SIGPIPE (et, par défaut, se terminera)

Présentation: S. Lavirotte – Auteurs : … et al* 18

Communication de Données entre Processus: Tube – pipe() 3/3

#define MAXL 100char Msg[MAXL];...int fds[2];pipe(fds);if (fork()) {

close(fds[0]);write(fds[1], "Salut !", sizeof("Salut !");...

} else {close(fds[1]);read(fds[0], Msg, MAXL);printf("%s\n", Masg);...

}

Présentation: S. Lavirotte – Auteurs : … et al* 19

Communication de données entre processusPipe nommé (fichier FIFO)

Inconvénient des pipes– Le pipe doit être créé par un ancêtre commun aux processus

communicants Les descripteurs correspondants sont hérités lors des fork()

Pipe nommé (fichier FIFO)– Structure et synchronisation semblable au pipe

– Désigné par un nom de fichier

#include <sys/types.h>

#include <sys/stat.h.h>

int mkfifo(const char *path, mode_t mode);

Présentation: S. Lavirotte – Auteurs : … et al* 20

Exemple de Communication de données entre Processus – Pipe Nommé –fichier FIFO)

Présentation: S. Lavirotte – Auteurs : … et al* 21

Avec fork, exec et redirections

Illustrations de différentes commandes

Présentation: S. Lavirotte – Auteurs : … et al* 22

Exécution du ShellRappel Principe Général

Présentation: S. Lavirotte – Auteurs : … et al* 23

Exécution du ShellCommande Simple

Présentation: S. Lavirotte – Auteurs : … et al* 24

Exécution du ShellCommande avec Redirection

Présentation: S. Lavirotte – Auteurs : … et al* 25

fd,

Exécution du ShellCommande en Arrière plan

Présentation: S. Lavirotte – Auteurs : … et al* 26

fd,

Exécution du ShellCommande avec Pipe

Présentation: S. Lavirotte – Auteurs : … et al* 27

Exécution du ShellScript (fichier de commandes)

Présentation: S. Lavirotte – Auteurs : … et al* 28

fd,

Exécution du ShellCommande interne (builtin)

Présentation: S. Lavirotte – Auteurs : … et al* 29