Un fichier unix est une suite de bytes (octets) matérialisée par des blocs disques, et une inode qui contient les propriétés du fichier mais pas son nom.
Le contenu est entièrement défini par le créateur.
La gestion des ressources nécessaires est la seule responsabilité du système (...)
[...] Si le fichier n'existait pas, il est ouvert en écriture. Ce n'est pas une erreur de créer un fichier qui existait déjà. Exemple : if = creat("essai_creat",0660)) perror("Erreur creat()") ; La fonction open() #include #include #include int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); Valeur retournée : descripteur de fichier ou en cas d'erreur. Cette primitive permet d'ouvrir (ou de créer) le fichier de nom pathname. L'entier flags détermine le mode d'ouverture du fichier. [...]
[...] Il n'y a pas création d'un nouveau processus, mais simplement changement de programme. Il y a six primitives exec() que l'on peut répartir dans deux groupes : les execl(), pour lesquels le nombre des arguments du programme lancé est connu, les execv() où il ne l'est pas. En outre toutes ces primitives se distinguent par le type et le nombre de paramètres passés. Premier groupe d'exec(). Les arguments sont passés sous forme de liste : int execl(char *path, char *arg0, char *arg char *argn,NULL) int execle(char *path,char *arg0,char *arg ,char *argn,NULL,char int execlp(char *file,char *arg0,char *arg ,char *argn,NULL) Dans execl et execle, path est une chaîne indiquant le chemin exact d'un programme. [...]
[...] Le code du processus appelant est détruit. #include main() { execl("/bin/ls","ls",NULL) ; printf ne suis pas mort\n") ; } Résultat de l'exécution : Systeme> test_exec fichier1 fichier2 test_exec test_exec.c Systeme> #include main() { if ( fork()==0 ) execl( "/bin/ls","ls",NULL) ; else { sleep(2) ; attend la fin de ls pour exécuter printf() printf suis le père et je peux continuer") ; } } Résultat de l'exécution : Systeme> test_exec_fork fichier1 fichier2 test_exec test_exec.c test_exec_fork test_exec_fork.c je suis le père et je peux continuer Systeme> Comportement vis-à-vis des fichiers ouverts Les descripteurs de fichiers ouverts avant l'appel d'un exec() le restent, sauf demande contraire (par la primitive fcntl()). [...]
[...] : ouverture en écriture à la fin du fichier (avec création préalable si le fichier n'existait pas). Exemple : ouverture préalable par open() par exemple en lecture if = open("mon_fichier", O_RDONLY, 0666)) { perror("Erreur ; exit(-1) ; } association de fp (de type FILE*) à fd (de type int) if = fdopen(fd, NULL) { perror("Erreur fdopen()") ; exit(-1) ; } Primitive dup() #include int dup(int fd) fd est le descripteur donné Valeur retournée : nouveau descripteur de fichier ou en cas d'erreur. [...]
[...] Le fils hérite d'un double de tous les descripteurs de fichiers ouverts du père (si le fils en ferme un, la copie du père n'est pas changée) ; les pointeurs de fichier associés sont partagés (si le fils se déplace dans le fichier, la prochaine manipulation du père se fera à la nouvelle adresse). Cette notion est importante pour implémenter des tubes. Exemple introductif #include #include #include void main() { pid_t p1 ; printf("Début de fork\n") ; p1 = fork() ; printf("Fin de fork p1) ; } Résultat de l'exécution : xures sources ./a.out Début de fork Fin de fork 16099 xures sources Fin de fork 0 xures sources Primitive wait() #include #include int wait(int *status) Valeur retournée : identificateur du processus mort ou en cas d'erreur. [...]
Source aux normes APA
Pour votre bibliographieLecture en ligne
avec notre liseuse dédiée !Contenu vérifié
par notre comité de lecture