Programmation système (Cours) Flashcards

(14 cards)

1
Q

Qu’est-ce que le prototype d’un wrapper d’appel système en C ?

A

int someSystemCall(…);

Code de retour :
−1 = erreur
≥ 0 = ok
< −1 = impossible

Variable globale errno :
type int
mise à jour en cas d’erreur
contenu non spécifié en cas de succès

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Comment les flux noyeau sont-ils representer en C ?

A

Flux représenté par un descripteur de fichier
Par défaut :
0 -> stdin
1 -> stdout
2 -> stderr
reste non défini

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Comment ouvrire un fichier avec les fonction “flux noyeau”

A

include <fcntl.h></fcntl.h>

-> int open(const char* path, int flags);

-> int open(const char* path, int flags, mode_t mode);

la fonction attribu le plus petit entier non attribué pour representer le flux..

La seconde version permet de spécifier des droit à la création d’un fichier

Flags fréquemment utilisés :

O_WRONLY écriture seule
O_RDONLY lecture seule
O_RDWR lecture + écriture
O_CREAT création si besoin
O_TRUNC supprime le contenu existant
O_APPEND ajout en fin de fichier

Lorsque O_CREAT :
cf man 2 chmod

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Comment fermet un flux vers un fichier ouver par les fonction “flux noyau” en C ?

A

#include <unistd.h>
int close(int fd);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Comment lire et écrire dans un flux via les fonction “flux noyeau” en C ?

A

include <unistd.h></unistd.h>

-> ssize_t read(int fd, void* buf, size_t nbytes);
-> ssize_t write(int fd, const void* buf, size_t nbytes);

Code de retour :
−1 si erreur
sinon, n ≥ 0 = nb. d’octets lus écrits 0 si lecture en fin de fichier
⇝ curseur déplacé de n octets
buf peut être :
un pointeur vers de la mémoire allouée par malloc
l’adresse d’une variable locale

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Comment modifier l’emplacement du curseur de lecture d’un flux via les fonction de “flux noyau” en C ?

A

include <unistd.h></unistd.h>

off_t lseek(int fd, off_t offset, int whence);

Code de retour :
−1 si erreur
sinon, pos ≥ 0 = nouvelle position absolue

whence peut être :
* SEEK_SET position par rapport au début du fichier
* SEEK_CUR position relative
* SEEK_END position par rapport à la fin du fichier

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Comment dupliquer un flux via les fonction “flux noyau” en C ?

A

include <unistd.h></unistd.h>

int dup(int oldfd);
int dup2(int oldfd, int newfd);

Code de retour :
−1 si erreur
sinon, num. du nouveau descripteur de fichier

dup ouvre un nouveaux flux pour le flux entrée en paramêtre et lui attribut commme descripteur le plus petit entier naturel disponible.

dup2 attribu au descripteur de aldfd le flux du descripteur de newfd.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Comment ouvrir et fermer des flux via les fonction “libc” en C ?

A

include <stdio.h></stdio.h>

FILE* fopen(const char* path, const char* mode);
int
fclose(FILE* stream);

Retour pour fopen :
* NULL si erreur
* pointeur valide sinon

Retour pour fclose :
* 0 si succès
* EOF si erreur

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Quels sont les mode de lecture de la “libc” et que font-ils ?

A

“r” : lecture | debut
“w” écriture | début | tronqué + créer le fichier si besoin
“a” écriture | fin |créer le fichier si besoin
“r+” lecture + écriture | début
“w+” : “r+” et tronqué + créer le fichier si besoin
“a+” : écriture + lecture | fin | créer le fichier si besoin

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Comment lire et écrire (non formaté) dans un fichier ouvert par des fonctions “libc” en C ?

A

include <stdio.h></stdio.h>

-> size_t fread(void* ptr, size_t size, size_t nb, FILE* stream);
-> size_t fwrite(const void* ptr, size_t size, size_t nb, FILE* stream)

ptr = données à écrire/lues, à voir comme un tableau d’éléments
size = taille d’un élément
nb = nombre d’éléments à lire/écrire
stream = flux sur lequel faire l’opération

Valeur de retour :
* si succès, n ≥ 0 = nb. d’éléments lus/écrits
* pour fread, 0 si erreur ou fin de fichier
* pour fwrite, erreur quand n < nb

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Comment lire et écrire (formaté) dans un fichier ouvert par des fonctions “libc” en C ?

A

include <stdio.h></stdio.h>

->int fprintf(FILE *stream, const char *format, …);
->int fscanf(FILE *stream, const char *format, …);

->int printf(const char *format, …);
->int scanf(const char *format, …);

Valeur de retour pour printf et fprintf :
<0 si erreur
n = nb. de caractères écrits sinon
Valeur de retour pour scanf et fscanf :
n = nb. de variables affectées
⇝ potentiellement moins que prévu, en cas d’erreur

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Quelles sont les autres fonction utile à connaitre dans <stdio.h> en C ?

A

include <stdio.h>

-> int fseek(FILE *stream, long offset, int whence);
long ftell(FILE* stream);
-> int fflush(FILE *stream);
-> int feof(FILE *stream);
-> int ferror(FILE *stream);
-> int fileno(FILE *stream);

  • fseek repositionne le curseur
  • ftell donne la position (absolue) du curseur
  • fflush force les entrées/sorties en cours
  • feof renvoie = 0 (vrai) si fin de fichier, 0 (faux) sinon
  • ferror renvoie = 0 (vrai) en cas d’erreur, 0 (faux) sinon
  • fileno renvoie le descripteur de fichier associé à stream
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Comment arreter le programme via une fonction en C ?

A

include <stdlib.h></stdlib.h>

-> void exit(int status);
-> void _Exit(int status);

exit :
* flush et ferme les flux libc ouverts
* appelle les fonctions enregistrées via atexit
* libère les ressources
* termine le programme
_Exit :
* garantit seulement libération des ressources et terminaison

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Comment manipuler les variables d’environnement (Valable pour UNIX) en C ?

A

include <stdlib.h>

-> char* getenv(const char* name);
-> int setenv(const char* name, const char* value, int overwrite);
-> int unsetenv(const char *name);

getenv retourne la valeur de la variable name qui peut être NULL
setenv définit ou met à jour la valeur de name
unsetenv supprime la variable name

How well did you know this?
1
Not at all
2
3
4
5
Perfectly