Programación de E / S de archivos
En File IO, se utiliza un descriptor de archivo para representar un archivo abierto, que puede acceder a diferentes tipos de archivos, como archivos ordinarios, archivos de dispositivo y archivos de canalización.
1. Apertura y cierre de expedientes
函数原型:int open(const char *pathname, int flags, int perms)
函数参数:pathname 被打开的文件名
flags 文件打开的方式
perms 新建文件的存取权限
函数返回值:成功---返回文件描述符;失败--- -1
valor de las banderas | Descripción del valor |
---|---|
O_RDONLY | Abra el archivo como de solo lectura |
O_WRONLY | Abra el archivo en modo de solo escritura |
O_RDWR | Abrir archivo para leer y escribir |
O_CREAT | Si el archivo no existe, cree un nuevo archivo y use el parámetro perms para establecer permisos para él. |
O_EXCL | Si el archivo ya existe cuando se usa O_CREAT, se puede devolver un mensaje de error |
O_NOCTTY | Si se abre el archivo de terminal, la interrupción no se convertirá en el terminal de control del proceso actual |
O_TRUNC | Si el archivo existe, se eliminarán los datos originales del archivo y el tamaño del archivo se establecerá en 0 |
O_APPEND | Al escribir un archivo, la posición de lectura y escritura del archivo apunta automáticamente al final del archivo |
函数原型:int close(int fd)
函数参数:fd 文件描述符
函数返回值:成功--- 0;失败--- -1
2. Archivo de lectura y escritura
函数原型:ssize_t read(int fd, void *buf, size_t count)
函数参数:fd 文件描述符
buf 指定存储器读出数据的缓冲区
count 指定读出的字节数
函数返回值:成功---读到的字节数;出错--- -1; 到达文件尾--- 0
函数原型:ssize_t write(int fd, void *buf, size_t count)
函数参数:fd 文件描述符
buf 指定存储器写入数据的缓冲区
count 指定写入的字节数
函数返回值:成功---已写的字节数;出错--- -1;
3. Ubicación del archivo
La función lseek () localiza la posición actual de lectura y escritura del archivo. Solo puede operar en archivos localizables (accesibles aleatoriamente). Las tuberías, los enchufes y la mayoría de los archivos de dispositivos de caracteres no admiten este tipo de operaciones.
函数原型:off_t lseek(int fd, off_t offset, int whence)
函数参数:fd 文件描述符
offset 相对于基准值的偏移量,以字节为单位,正数表示向前移动,负数表示向后移动
whence 基准值
-->SEEK_SET 代表文件起始位置
-->SEEK_END 代表文件结束位置
-->SEEK_CUR 代表文件当前读写位置
函数返回值:成功---文件当前读写位置;失败--- -1
4. Bloqueo de archivos
Cuando varios programas trabajan juntos en un archivo compartido, el archivo se bloquea para resolver la competencia por los recursos compartidos.
函数原型:int fcntl(int fd, int cmd, struct * flock)
函数参数:fd 文件描述符
cmd -->F_GETLK:检测文件锁状态
-->F_SETLK:设置lock描述的文件锁
-->F_SETLKW:F_SETLK的阻塞版本
-->若无法获取锁,会进入睡眠状态;若可以获取锁或捕捉到信号则会返回
flock 如果cmd和锁操作有关,则需要使用该参数
函数返回值:成功--- 0;失败--- -1
flock 结构体定义
struct flock{
short l_type;
off_t l_start;
short l_whence;
off_t l_len;
pid_t l_pid;
}
estructura de la bandada | Significado de cada miembro |
---|---|
l_type | F_RDLCK: bloqueo de lectura (bloqueo compartido) |
F_WRLCK: bloqueo de escritura (bloqueo exclusivo) | |
F_UNLCK: desbloquear | |
l_start | El desplazamiento relativo (bytes) del área bloqueada en el archivo, junto con l_whence, determina la posición real del área bloqueada |
l_de ahí | SEEK_SET: la posición actual es el comienzo del archivo y la nueva posición es el tamaño del desplazamiento |
SEEK_CUR: la posición actual es la posición del puntero del archivo, y la nueva posición es la posición actual más el desplazamiento | |
SEEK_END: la posición actual es el final del archivo y la nueva posición es la longitud del archivo más el desplazamiento | |
l_len | La longitud del área bloqueada |
l_pid | Con un candado que bloquea el proceso actual, el número de proceso del proceso de retención se almacena en l_pid, que solo lo devuelve F_GETLK |
Para bloquear todo el archivo: l_start = 0; l_whence = SEEK_SET; l_len = 0