Gestor de Memoria - Práctica 3 OS 1.0
Simulador de gestión de memoria con algoritmos de Primer Hueco y Siguiente Hueco.
Cargando...
Buscando...
Nada coincide
file_utils.c
Ir a la documentación de este archivo.
1
11
12#include "file_utils.h"
13#include <sys/fcntl.h>
14#include <unistd.h>
15#include <fcntl.h>
16#include <errno.h>
17
18int write_all(int fd, const void* buffer, size_t size)
19{
20 size_t total_written = 0;
21 ssize_t bytes_written;
22
23 while (total_written < size) {
24 bytes_written = write(fd, buffer + total_written, size - total_written);
25 if (bytes_written == -1) {
26 if (errno == EINTR) continue;
27 return -1;
28 }
29 total_written += bytes_written;
30 }
31 return 0;
32}
33
34ssize_t read_all(int fd, void *buffer, size_t size) {
35 size_t total_read = 0;
36 ssize_t bytes_read;
37 char *buf = (char *)buffer;
38
39 while (total_read < size) {
40 bytes_read = read(fd, buf + total_read, size - total_read);
41 if (bytes_read == -1) {
42 if (errno == EINTR) continue;
43 return -1;
44 }
45 if (bytes_read == 0)
46 break; // EOF
47 total_read += bytes_read;
48 }
49 return total_read;
50}
51
52ssize_t transfer_data(int fd_src, int fd_dst, char *buffer, ssize_t buffer_size)
53{
54 ssize_t bytes_read;
55 ssize_t total_transfered = 0;
56
57 while((bytes_read = read(fd_src, buffer, buffer_size)) > 0) {
58 if (write_all(fd_dst, buffer, bytes_read) == -1)
59 return -1;
60 total_transfered += bytes_read;
61 }
62 return (bytes_read == -1 ) ? -1 : total_transfered;
63}
64
65ssize_t transfer_all(int fd_src, int fd_dst)
66{
67 char buffer[DEFAULT_BUFFER_SIZE];
68 return transfer_data(fd_src, fd_dst, buffer, DEFAULT_BUFFER_SIZE);
69}
70
71ssize_t copy_file(const char *src_path, const char *dst_path)
72{
73 int fd_src, fd_dst;
74 ssize_t result;
75
76 fd_src = open(src_path, O_RDONLY);
77 if (fd_src == -1) return -1;
78
79 fd_dst = open(dst_path, O_WRONLY | O_CREAT | O_TRUNC | 0644);
80 if (fd_dst == -1) {
81 close(fd_dst);
82 return -1;
83 }
84
85 result = transfer_all(fd_src, fd_dst);
86
87 close(fd_src);
88 close(fd_dst);
89 return result;
90}
Librería de utilidades para operaciones de E/S con descriptores de fichero.
ssize_t copy_file(const char *src_path, const char *dst_path)
Copia un archivo completo a otra ubicación.
Definition file_utils.c:71
#define DEFAULT_BUFFER_SIZE
Tamaño del buffer interno usado por transfer_all() (4KB).
Definition file_utils.h:46
int write_all(int fd, const void *buffer, size_t size)
Escribe todos los bytes del buffer al descriptor de fichero.
Definition file_utils.c:18
ssize_t read_all(int fd, void *buffer, size_t size)
Lee hasta size bytes de un descriptor a un buffer.
Definition file_utils.c:34
ssize_t transfer_all(int fd_src, int fd_dst)
Transfiere todo el contenido de un descriptor a otro.
Definition file_utils.c:65
ssize_t transfer_data(int fd_src, int fd_dst, char *buffer, ssize_t buffer_size)
Transfiere datos de un descriptor de origen a uno de destino.
Definition file_utils.c:52