Anda di halaman 1dari 11

SISTEMAS OPERATIVOS

Fernando Durán 28 Jun 2010

Tema: Programas

Programa para copiar archivos

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define TAMANYO_ALM 1024!


main (int argc,char* argv[])
{
! int ! fd_ent, fd_sal;! !
! char! almacen[TAMANYO_ALM];!
! int ! n_read;! ! !
!
! /* Abrir el archivo de entrada */
! fd_ent = open (argv[1], O_RDONLY);
! if (fd_ent < 0)
! {
! ! perror ("Error al abrir");!
! ! exit (-1);
! }
! /* Crear el archivo de salida. Modo de protección: rw-r--r--*/
! fd_sal = creat (argv[2], 0644);
! if (fd_sal < 0)
! {
! ! perror ("Error al crear");
! ! exit (-1);
! }
! /* Se lee y escribe */
! while ((n_read = read (fd_ent, almacen, TAMANYO_ALM)) >0 )
! {
! ! /* Se escribe el almacen al archivo de salida */
! ! if (write (fd_sal, almacen, n_read) < n_read)
! ! {
! ! ! perror ("Error de escritura");
! ! ! close (fd_ent);
! ! ! close (fd_sal);
! ! ! exit (-1);
! ! }
! }
! if (n_read < 0)
! {
! ! perror ("Error de lectura");
! ! close (fd_ent);
! ! close (fd_sal);
! ! exit (-1);
! }
! /* Se cierran los archivos */
! close (fd_ent);
! close (fd_sal);
! exit (0);
}
Este es el archivo original:
Este es el archivo resultante de la copia.
Programa para mostrar las ultimas lineas
#include<stdio.h>
#include<errno.h>
#include<fcntl.h>
#include <stdlib.h>
#include <string.h>

main(int argc,char* argv[])


{
! char buffer[1024];
! int lineas=0,i,movimiento=0,lineasTotales=1,lineasParaMostrar=0;
! int bytesl;
!
! //Se abre el archivo
! int archivoa=open(argv[1],O_RDONLY);
!
! if(archivoa==-1)
! {
! ! perror("Error al abrir archivo");
! ! exit(1);
! }

! //Se lee el archivo


! while(bytesl=read(archivoa,buffer,1024))
! {
! ! for(i=0;i<=1024;i++)
! ! {
! ! ! if(buffer[i]=='\n')
! ! ! {
! ! ! ! lineasTotales++;
! ! ! }
! ! }
! ! if(bytesl==-1)
! ! {
! ! ! break;
! ! }
! }
! lineasTotales=lineasTotales-1;
! close(archivoa);
!
! //Se muestra la cantidad de lineas y se pide cuantas se quiere
mostrar
! printf("Lineas totales: %d\n",lineasTotales);
!
! printf("Cuantas lineas ");
! scanf("%d",&lineasParaMostrar);
!
! archivoa=open(argv[1],O_RDONLY);
!
! if(lineasParaMostrar>=lineasTotales)
! {
! ! lineasParaMostrar=0;
! }
!
! else
! {
! ! //Se lee otra vez hasta saber hasta que posicion se debe
desplazar
! ! while(bytesl=read(archivoa,buffer,1024))
! ! {
! ! ! for(i=0;i<=1024;i++)
! ! ! {
! ! ! ! if(buffer[i]!='\n')
! ! ! ! {
! ! ! ! ! movimiento++;
! ! ! ! }
! ! ! !
! ! ! ! else
! ! ! ! {
! ! ! ! ! movimiento++;
! ! ! ! ! lineas++;
! ! ! ! }
! ! ! ! /*Se acaba la lectura cunado ya se sabe
! ! ! ! cuanto se debe desplazar en el archivo*/
! ! ! ! if(lineas==lineasTotales-lineasParaMostrar)
! ! ! ! {
! ! ! ! ! break;
! ! ! ! }
! ! ! }
! ! ! if(bytesl==-1)
! ! ! {
! ! ! ! break;
! ! ! }
! ! }
! !
! ! close(archivoa);
! }
!
! archivoa=open(argv[1],O_RDONLY);
! /*Se desplaza en el archivo para mostar solo la ultimas lineas
deseadas*/
! lseek(archivoa,movimiento,SEEK_SET);
!
! while(bytesl=read(archivoa,buffer,1024))
! {
! ! if(bytesl==-1)
! ! {
! ! ! break;
! ! }
! !
! ! write(0,buffer,bytesl);
! }
! printf("\n");
! close(archivoa);
!
}
Este es el archivo sobre el que se va a ejecutar el programa
Programa que coloca cadenas al inicio, en la mitad y al final de un archivo.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define TAMANYO_ALM 2048!


main (int argc,char* argv[])
{
! int fd_ent,sz,mitad,n_read,i;
! const char* cadena="cadena1";
! const char* cadena2="cadena2";
! char! almacen[TAMANYO_ALM];
! char! almacen2[TAMANYO_ALM];
!
! //Se abre el archivo deseado
! fd_ent = open (argv[1], O_RDWR);
!
! if(fd_ent==-1)
! {
! ! perror("Error al leer el archivo");
! ! exit(1);
! }
!
! /*Se desplaza hasta al final para conocer el tamaño del archivo*/
! lseek(fd_ent, 0L, SEEK_END);
! sz = lseek(fd_ent, 0L, SEEK_CUR);
! printf("\nsize:%d\n",sz);
!

! mitad=sz/2+1;
!
! /* Coloca el puntero en la posición 0 */
! lseek(fd_ent,0,SEEK_SET);
! !
! //se va a mover los datos del rango[inicio, mitad]
! n_read = read (fd_ent, almacen, mitad);
!
! //Se guarda lo datos que estan desde la mitad hasta el final
! n_read = read (fd_ent, almacen2, mitad);
!
! //Se escribe la cadena al inicio y luego el contenido de la primera
mitad
! lseek(fd_ent,0L,SEEK_SET);
! write(fd_ent, cadena, strlen(cadena));
! write(fd_ent, almacen, mitad);
!
! //Se escribe la cadena2 en la mitad y luego el contenido de la
segunda mitad
! write(fd_ent, cadena2, strlen(cadena2));
! write(fd_ent, almacen, mitad);
!
! //Se escribe las cadenas 1 y 2 al final del archivo
! lseek(fd_ent,0L,SEEK_END);
! write(fd_ent, cadena, strlen(cadena));
! write(fd_ent, cadena2, strlen(cadena2));
!
! close(fd_ent);

}
Bibliografía:

-Sistemas Operativos Una visión Aplicada Autores: Jesús Carretero, Pedro De Miguel
Anasagasti, Félix García, Fernando Pérez.

- POSIX programmer's guide: writing portable UNIX programs with the POSIX Autor:
Donal Lewine

http://sopa.dis.ulpgc.es/prog_c/FICHER.HTM
http://www.sics.se/man2html/open.2v.html
http://www.sics.se/man2html/read.2v.html
http://www.sics.se/man2html/creat.2v.html
http://www.sics.se/man2html/write.2v.html
http://www.sics.se/man2html/lseek.2v.html
http://www.linuxinfor.com/spanish/man2/lseek.html

Anda mungkin juga menyukai