Programacion : Llamadas al sistema

Buenas, he leido sobre las llamadas al sistema, en contreto a la seccion de E/S por ficheros.

la cuestion esque sobre la funcion read y write tengo unas dudillas, a ver si alguien me puede ayudar :P

#include
#include
#include
#define PERMS 0666

main(int argc, char **argv)
{
int f1, f2, n;
char buf[BUFSIZ];

if (argc != 3)
printf("Usage: cp from to\n");
if ((f1 = open(argv[1], O_RDONLY, 0)) == -1)
printf("cp: can't open %s\n", argv[1]);
if ((f2 = creat(argv[2], PERMS)) == -1)
printf("cp: can't open %s, mode %03o\n", argv[2], PERMS);
while ((n = read(f1, buf, BUFSIZ)) > 0)
if (write(f2, buf, n) !=n)
printf("cp: write error on file %s\n", argv[2]);
return 0;
}

Mirar esta version lite de "cp", mi duda esta en el read :

int read ( int fichero, void* buffer, unsigned bytes );

Concretamente en "void* buffer", segun lei es un puntero al área de memoria donde se va a efectuar la transferencia. y segun lei, ahi se pone un array, y eso es lo que no llego a entender, segun el array de este ejemplo buf[8192], al leer que va metiendo la info en ese array haciendo de buffer?(es decir como si el buffer de una grabadora de cds se tratase) o como?, si se llena entero y aun el archivo no se ha leido del todo que pasa?, o por eso buf y BUFSIZ valen lo mismo, es decir, para que no falte espacio.

Es que no me aclaro lo que hace esto exactamente para leer un archivo, lueg en el tema de escribir, copia el contenido del array al fichero supongo, y copia "n" bytes, es decir, el numero de bytes que leyo antes, correcto?

A ver si podeis explicarmelo de una forma mas humana :P

Otra duda: Yo creo que con el sistema de E/S de ANSI C que usaba en windows, cuando copiaba un fichero a otro lo hacia copiando caracter por caracter, y con este programa he copiado una peli a otro lado directamente y no comprendo como lo hace, que tipo de info guarda en el el array, y si con ese programa se puede copiar todo, es decir que el buffer se va vaciando o algo para meter nueva informacion o como va eso...

plis que alguien me saque de la duda, que me explique bien las funciones estas :P

Saludos.
Hum... me iba a poner a explicarte, pero mejor te dejo la pagina de la asignatura que cursé el año pasado de laboratorio de sistemas operativos que seguro que te vale :D
http://encina.fis.usal.es/~labssoo/
Salu2! ;D
eaTHaN, no comrpendo tu respuesta, estoy un poco tonto,xDDDDDDD.

Saludos.
Pues que te iba a explicar como se usar write y demas, pero como he tenido este año una asignatura que era "Laboratorio de Sistemas Operativos" y trataba de eso (llamadas al sistema) pues te pongo el link a la web del profesor que vienen los temas y demas para que practiques ;D
Salu2!!!
PD.- Los temas estan casi abajo del todo :)
Hombre , pues yo creo que te ha dado la mejor respuesta , más curro x'D , hacerte las practicas 1 y 2 parece recomendable para que te enteres bien del tema...

Sobre lo que dices , pues el buffer es una zona de memoria a la que llevas la información del disco duro y luego la vuelves a guardar en el hd (en otro lado) .... esto de forma sencilla , en realidad se complica más la cosa para optimizar ( dma , sistemas de gestión de páginas ...)

Y no es como el de la grabadora , que sería más bien una memoria fifo ,(los primeros datos que entran son los primeros que salen) que se usa entre disco duro y/o memoria hacia la grabadora , para tener un control en el flujo de datos proporcionados a la grabata (pa que no se quede sin ellos y se joda el cedese ;-) )

Jo , menudo rollo he soltado :Ð

Salu2

Pd. Cuanto tiempo eathan [+risas]

edit: juass se me han adelantao x'D
dykstra escribió:Pd. Cuanto tiempo eathan [+risas]

Es lo malo de vivir en verano sin internet (bueno, los findes si tenia, pero miraba el correo y poco mas) y de tener examenes en septiembre :/ Ya solo me queda el ultimo el dia 9 [Alaa!]
Salu2 dykstra [sonrisa]
Bueno, ya solo me quedan un par de dudas :D

Segun un manual que tengo pone que para usar la funcion open necesito incluir estas tres cabeceras:

#include
#include
#include

y para read y write:

#include

Y como podeis ver, yo en este programa he usado estas tres funciones y solo la libreria de :

#include

y sin embargo funcionan perfecto, eso porque?


Y la otra duda es:

Cuando yo tenga que trabajar con archivos en mis programas, uso las llamadas al sistema o tambien tengo que usar las funciones de ANSI?(fclose, fopen, fprintf, etc), o con estas ya puedo hacer todo?

un saludo y gracias :D.
Compila el programa con -Wall , para que te muestre todos los warnings del programa...
Supongo que será porque aunque no hallas incluido el prototipo de la función (que estará en el .h) , te enlazará el gcc con la librería donde esté a causa de alguna otra función que hallas llamado...

Sobre si usar llamadas al sistema o las de C... las de C te proporcionan más compatibilidad (valdrían para win por ej ) y las llamadas al sistema valdrían por ejemplo para manejar archivos de + de 2Gb por ejemplo.... pero vamos para una aplicación para unix no tienen prácticamente diferencia (o eso creo yo :p )

Ah , el flag de la llamada para archivos de más de 2Gb ya se comentó (con código incluido :p ) , así ke ya sabes , buskeda si lo kieres..


Salu2
7 respuestas