-
Notifications
You must be signed in to change notification settings - Fork 16
/
IO_filedescriptors.txt
150 lines (132 loc) · 8.35 KB
/
IO_filedescriptors.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
IO_FILEDESCRIPTORS
HEADER ==> #<unistd.h>
STDIN_FILENO #Macro pour la valeur de stdin (0)
STDOUT_FILENO #Macro pour la valeur de stdout (1)
STDERR_FILENO #Macro pour la valeur de stderr (2)
HEADER ==> #<sys/stat.h>
O_* FLAGS ==> #Ces flags sont des macros utilisés par open() et
#fcntl(), qu'il faut bitwise-or'd. La valeur indiquée
#est en octal, et est celle de mon système :
ARGUMENT O_* FLAGS ==> #Voici :
O_RDONLY #Lecture seule (valeur : 00)
O_WRONLY #Ecriture seule (valeur : 01)
O_RDWR #Lecture et écriture (valeur : 02)
FILE CREATION O_* FLAGS
==> #Voici :
O_CREAT #Si le fichier n'existe pas, il est créé en fonction des
#flags commençant par S_ spécifiés, après application
#de l'umask.
#L'EUID devient le propriétaire du fichier et le GID le
#groupe propriétaire. (valeur : 0100)
O_EXCL #En conjonction avec O_CREAT, renvoie une erreur si le
#fichier existe déjà, ou s'il s'agit d'un lien
#symbolique. (valeur : 0200)
O_TRUNC #Si le fichier existe, qu'il est régulier, et que
#O_WRONLY ou O_RDWR est spécifié, le fichier est tronqué
#à l'ouverture (valeur : 01000)
FILE STATUS O_* FLAGS
==> #Voici :
O_APPEND #Avant chaque write(), le file position indicator est
#positionné à la fin du fichier, puis repositionné
#comme avant ensuite (par exemple pour une lecture)
#(valeur : 02000)
O_LARGEFILE #Utilise open64() à la place de open() (valeur : 100000)
#Ceux -ci demandent un #define _GNU_SOURCE :
O_DIRECTORY #Echoue si le fichier n'est pas un répertoire. Utile
#seulement pour éviter des attaques DoS via un opendir()
#sur FIFO (valeur : 0200000)
O_NOATIME #N'update pas l'atime lors d'une lecture du fichier avec
#read() (valeur : 01000000)
O_NOFOLLOW #Echoue si le fichier est un lien symbolique
#(valeur : 0400000)
open(STR, INT_VAL #Ouvre STR en fonction du mode INT_VAL.
[, INT_VAL2]) #Le file position indicator est au début.
#INT_VAL est une combinaison de flags bitwise-or'd
#commençant par O_
#INT_VAL2 est une combinaison de flags bitwise-or'd
#commençant par S_ utilisé si O_CREAT est spécifié pour
#indiquer les droits d'accès du fichier créé. INT_VAL2
#est obligatoire si O_CREAT est spécifié.
#Les liens symboliques sont suivis.
#Pour être utilisable, il doit y avoir l'un (et
#seulement un) de ces flags : O_RDONLY, O_WRONLY ou
#O_RDWR. Seul O_RDONLY est possible pour un répertoire
#Sans O_CREAT, si fichier n'existe pas, renvoie une
#erreur
----| Et renvoie le fichier sous forme de file descriptor
| INT_VAL, ou -1 si erreur
creat(STR, INT_VAL2) #Equivaut à open(STR, O_CREAT|O_WRONLY|O_TRUNC)
HEADER ==> #<unistd.h>
close(INT_VAL) #Ferme le file descriptor INT_VAL.
----| Renvoie 0, ou -1 si échec
read(INT_VAL, VOID_ADR, #Lit SIZE_T_VAL octets du file descriptor INT_VAL, et
SIZE_T_VAL) #enregistre le résultat à partir de VOID_ADR. Le file
#position indicator est déplacé en conséquence.
----| Renvoie le nombre d'octets lus (donc 0 si EOF) sous
| forme de SSIZE_T_VAL, ou -1 si erreur.
write(INT_VAL, VOID_ADR,#Ecrit les SIZE_T_VAL premiers octets à partir de
SIZE_T_VAL) #VOID_ADR dans le file descriptor INT_VAL à partir du
#file position indicator. Le file position indicator est
#déplacé en conséquence.
#Les data sont en fait bufferisées avant d'être vraiment
#imprimées sur le périphérique.
----| Renvoie le nombre d'octets écrits sous forme de
| SSIZE_T_VAL, ou -1 si erreur. Si le nombre renvoyé est
| inférieur à SIZE_T_VAL, tout n'a pas pu être écrit.
HEADER ==> #<unistd.h>
MACROS A DEFINIR ==> #_XOPEN_SOURCE 500
pread(INT_VAL, VOID_ADR,#Equivaut à un read(INT_VAL, VOID_ADR, SIZE_T_VAL),
SIZE_T_VAL, OFF_T_VAL) #sauf que la lecture n'a pas lieu à partir du file
#position indicator mais depuis le début + OFF_T_VAL
#octets.
#Permet donc un random access : le périphérique doit le
#supporter.
#Le file position indicator n'est pas modifié.
pwrite(INT_VAL, VOID_ADR#Equivaut à un write(INT_VAL, VOID_ADR, SIZE_T_VAL),
SIZE_T_VAL, OFF_T_VAL) #sauf que l'écriture n'a pas lieu à partir du file
#position indicator mais depuis le début + OFF_T_VAL
#octets.
#Permet donc un random access : le périphérique doit le
#supporter.
#Le file position indicator n'est pas modifié.
HEADER ==> #<sys/types.h>
lseek(INT_VAL, #Strictement équivalent à un fseek(), sauf qu'il utilise
OFF_T_VAL, INT_VAL2) #un file descriptor INT_VAL, et non un FILE_ADR.
#De même, il vaut mieux ouvrir le file descriptor avec
#O_APPEND plutôt que d'utiliser SEEK_END, qui peut poser
#des problèmes si plusieurs fichiers écrivent en même
#temps.
#Permet donc un random access : le périphérique doit le
#supporter.
#Si le file position est au-delà de la fin du fichier,
#la prochaine écriture remplira l'écart de '\0', créant
#ainsi un sparse file.
HEADER ==> #<stdio.h>
MACROS A DEFINIR ==> #_POSIX_C_SOURCE 1
fdopen(INT_VAL, STR)----# Renvoie un FILE_ADR associé au file descriptor INT_VAL
| en fonction du mode STR. Le mode STR est le même que
| celui de fopen(), et doit être compatible avec les
| flags du file descriptor, sinon erreur.
| Différences cependant :
| - "b" n'est pas permis
| - "w" et "w+" ne tronquent pas
| Renvoie NULL si erreur.
fileno(FILE_ADR) ----# Renvoie le file descriptor de FILE sous forme
| d'INT_VAL, ou -1 si erreur
A COMPLETER ==>
HEADER ==> #<unistd.h>
COMMANDES FCNTL ==> #Il s'agit de macros :
F_DUPFD #
F_GETFD #
F_SETFD #
F_GETFL #
F_SETFL #
F_GETLK #
F_SETLK #
F_SETLKW #
F_GETOWN #
F_SETOWN #
fcntl(INT_VAL, INT_VAL2[, INT_VAL3])#Exécute une action sur le file descriptor INT_VAL en fonction de la commande fcntl INT_VAL2 (macro, voir ci-dessus). En fonction de cette dernière, un argument supplémentaire INT_VAL3 peut être nécessaire.
<== FIN DE "A COMPLETER"