Objectifs - Juuujuuu/Pipex GitHub Wiki

Rendu

L'executable doit être nommé pipex.

Il devra être executé : ./pipex file1 cmd1 cmd2 file2 Pour reproduire le comportement de la commande shell :<file 1 cmd1 | cmd2 > file2

NB : Fuites de mémoire seront non tolérées

Fonctions Autorisées :

  • access : vérifie si le processus appelant peut accéder au fichier pathname. Si pathname est un lien symbolique, il est déréférencé.

renvoie 0 pour indiquer que le fichier existe et que l'accès spécifié correspond. renvoie -1 pour indiquer que le fichier n'existe pas ou que le mode d'accès spécifié ne correspond pas. Dans ce cas, il sera possible d'obtenir des informations supplémentaires en consultant la variable errno.

  • open : Étant donné le chemin pathname d'un fichier, open() renvoie un descripteur de fichier, un petit entier positif ou nul utilisable par des appels système ultérieurs (read(2), write(2), lseek(2), fcntl(2), etc.). Le descripteur de fichier renvoyé par un appel réussi sera le plus petit descripteur de fichier non encore ouvert pour le processus.

Renvoie le nouveau descripteur de fichier si réussite Renvoie -1 en cas d'échec

  • unlink: unlink() détruit un nom dans le système de fichiers. Si ce nom était le dernier lien sur un fichier, et si aucun processus n'a ouvert ce fichier, ce dernier est effacé, et l'espace qu'il utilisait est rendu disponible.

Renvoie 0 si réussite Renvoie -1 si échec

  • close : close() ferme le descripteur fd, de manière à ce qu'il ne référence plus aucun fichier, et puisse être réutilisé. Tous les verrouillages d'enregistrement (voir fcntl(2)) sur le fichier qui lui était associé, appartenant au processus, sont supprimés (quelque soit le descripteur qui fut utilisé pour obtenir le verrouillage).

Renvoie 0 si réussite Renvoie -1 si échec

*** read **: read() lit jusqu'à count octets depuis le descripteur de fichier fd dans le tampon pointé par buf. Si count vaut zéro, read() renvoie zéro et n'a pas d'autres effets. Si count est supérieur à SSIZE_MAX, le résultat est indéfini.

Renvoie le nb d'octets lus si réussite Renvoie -1 si échec

  • **write **: write() écrit jusqu'à count octets dans le fichier associé au descripteur fd depuis le tampon pointé par buf.

Renvoie le nombre d'octets écrits (0 signifiant aucune écriture) ssi réussite Renvoie -1 si échec

  • malloc : malloc() alloue size octets, et renvoie un pointeur sur la mémoire allouée. Le contenu de la zone de mémoire n'est pas initialisé. Si size vaut 0, malloc() renvoie soit NULL, soit un pointeur unique qui pourra être passé ultérieurement à free() avec succès.

  • waipid :'appel système waitpid() suspend l'exécution du processus appelant jusqu'à ce que le fils spécifié par son pid ait changé d'état. Par défaut, waitpid() n'attend que les fils terminés, mais ce comportement est modifiable avec l'argument options comme décrit plus loin.

  • wait : L'appel système wait() suspend l'exécution du processus appelant jusqu'à ce que l'un de ses fils se termine.

  • free : free affiche les quantités totales de mémoire et de zone de swap libres et utilisées dans le système, ainsi que la mémoire partagée et les buffers utilisés par le noyau.

  • pipe : pipe() crée un tube, un canal unidirectionnel de données qui peut être utilisé pour la communication entre processus.

Le tableau pipefd est utilisé pour renvoyé deux descripteurs de fichier faisant référence aux extrémités du tube. pipefd[0] fait référence à l'extrémité de lecture du tube. pipefd[1] fait référence à l'extrémité d'écriture du tube. Les données écrites sur l'extrémité d'écriture du tube sont mises en mémoire tampon par le noyau jusqu'à ce qu'elles soient lues sur l'extrémité de lecture du tube.

Renvoie 0 si réussite Renvoie -1 si échec

  • dup : dup() utilise le plus petit numéro inutilisé pour le nouveau descripteur.

  • dup2 : dup2() transforme newfd en une copie de oldfd, fermant auparavant newfd si besoin est

Dup et dup2 renvoient le nouveau descripteur si réussite Renvoient -1 si échec

  • execve : Cette fonction permet d'exécuter un processus enfant avec un tableau de paramètres et ses variables d'environnement.

  • fork : fork() crée un nouveau processus en dupliquant le processus appelant. Le nouveau processus, que l'on appelle processus fils, est la copie exacte du processus appelant, que l'on appelle processus père ou parent.

Le PID du fils est renvoyé au processus parent, et 0 est renvoyé au processus fils si réussite -1 est renvoyé dans le contexte du parent, pas de processus fils crée

  • perror : perror() affiche un message sur la sortie d'erreur standard, décrivant la dernière erreur rencontrée durant un appel système ou une fonction de bibliothèque. D'abord, (si s n'est pas NULL et si *s n'est pas un octet nul), la chaîne de caractère s est imprimée, suivie d'un deux points (« : ») ou d'un blanc, puis le message, suivi d'un saut de ligne.

La chaîne de caractères contient généralement le nom de la fonction où s'est produit l'erreur. Le numéro d'erreur est obtenu à partir de la variable externe errno, qui contient le code d'erreur lorsqu'un problème survient, mais qui s'est pas effacée lorsqu'un appel est réussi.

La liste globale d'erreurs sys_errlist[] indexée par errno peut être utilisée pour obtenir le message d'erreur sans le saut de ligne. Le plus grand numéro de message contenu dans cette table est sys_nerr - 1. Soyez prudents lors des accès directs dans cette liste, car de nouvelles erreurs n'ont peut-être pas de message dans sys_errlist[].

Quand un appel système échoue, il renvoie habituellement -1, et place le code d'erreur dans errno. (Les codes sont décrits dans <errno.h>.) Beaucoup de fonctions de bibliothèque se comportent également ainsi. La fonction perror() permet de traduire les codes d'erreur en une forme intelligible. Notez que errno est indéfinie après un appel de fonction de bibliothèque réussi. Cette fonction peut modifier errno même si elle réussit, ne serait-ce que par des appels système internes qui peuvent échouer.

Ainsi, si un appel qui échoue n'est pas immédiatement suivi par perror(), la valeur de errno doit être sauvegardée.

  • strerror : La fonction strerror() renvoie une chaîne décrivant le code d'erreur passé en argument errnum, en utilisant éventuellement la catégorie LC_MESSAGES de la localisation pour sélectionner la langue appropriée. Cette chaîne ne doit pas être modifiée par l'application, mais peut être écrasée par un appel ultérieur à perror(3) ou strerror(). Aucune autre fonction de bibliothèque ne modifie cette chaîne.

  • exit : La fonction exit() termine normalement le processus et la valeur status & 0377 est renvoyée au processus parent. Tous les flux ouverts de type stdio(3) sont vidés et fermés. Les fichiers créés par tmpfile(3) sont supprimés.

La fonction exit() ne revient jamais.

⚠️ **GitHub.com Fallback** ⚠️