Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Archivos S.O.
Archivos S.O.
57
58
#include <fcntl.h>
int creat (nombre, mode_t permisos);
const char *nombre;
mode_t permisos;
Si existe el fichero :
No modifica los permisos.
Si tiene permiso de escritura borra el contenido.
Sino tiene permisos de escritura da un error.
Sino existe:
Lo crea y aade permisos de escritura.
Devuelve un entero:
Sino hay error: entre 0 y 19 (el descriptor del fichero). Devolver el
ms bajo que este libre (no asociado).
Si hay error: un nmero negativo.
Ejemplos:
fd=creat(prueba,0666);
fd=creat(/usr/prcticas/hola/prueba.c,0600);
59
Devuelve:
El nmero de caracteres que ha podido escribir (n_escritos).
Un valor negativo si ha ocurrido un error en la llamada.
Ejemplos:
int n_escritos, fprueba;
fprueba =creat(fprueba,0666);
n_escritos= write(fprueba,Esto es el dato del fichero\0,28);
60
b)
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{ int i, fd;
fd=creat(prueba,0600);
for (i=0;i<10;i++) write(fd,&i,sizeof(i));
exit(0);
}
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{ int i, fd, vector[10];
fd=creat(prueba,0600);
for (i=0;i<10;i++) vector[i]=i ;
write(fd,vector,sizeof(vector));
exit(0);
}
!!!Faltara cerrar el fichero!!!
Sistemas Operativos (IS11) Tema 1
61
Devuelve:
0 si se ha cerrado el fichero
-1 en caso contrario.
Ejemplo 2: #include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{ int fd, i, vector[10];
fd=creat(prueba,0600);
for (i=0;i<10;i++) vector[i]=i;
write(fd,vector,sizeof(vector));
close(fd);
exit(0);
}
Sistemas Operativos (IS11) Tema 1
62
Devuelve:
-1 si se produce un error
El nmero de descriptor asociado al fichero abierto (el ms
bajo libre en la tabla de descriptores).
Modos:
63
64
65
66
Ejemplo 4:
#include <stdio.h>
main()
{ printf(Inicio de test\n);
if (fork() = = 0)
printf(Yo soy el hijo \n);
else
printf(Yo soy el padre \n);
exit(0);
}
Sistemas Operativos (IS11) Tema 1
67
exit(0);
68
#include <stdio.h>
int main()
{ int i, j fd;
int dato;
fd= open(fprueba,O_RDONLY);
if (fork()!=0)
{ while (read(fd,&dato,sizeof(int))>0)
{ for (j=0;j<100000;j++); /*espera*/
printf(Proceso padre. Dato =%d\n,dato);}
}
else
{ while (read(fd,&dato,sizeof(int))>0)
{ for (j=0;j<100000;j++); /*espera*/
printf(Proceso hijo. Dato =%d\n,dato); }
}
close(fd);
exit(0);
}
Sistemas Operativos (IS11) Tema 1
69
70
Ejemplo:
execlp(ls,ls,-l,NULL);
execvp(ls,ls -l);
71
72
73
int pipe(descriptor);
int descritor[2];
descriptor[1]: descriptor para escribir datos en la tubera.
descriptor[0]: descriptor para leer datos de la tubera (en orden llegada)
Cuando se cierra descriptor[1] se introduce un EOF.
74
!! Mal, no acaba !! hay que cerrar fd[1] para que read no se bloquee
Sistemas Operativos (IS11) Tema 1
75
int main(argc,argv[])
int argc; char *argv[];
{int tubera[2], dato, suma, estado;
pipe(tuberia);
if (fork()!=0)
{ /* proceso padre, escribe de 1 a dato */
close(tuberia[0]);
dato=atoi(argv[1]); /*transforma argv[1] en entero*/
for (i=1;i<=dato;i++) write(tuberia[1],&i,sizeof(int));
close(tuberia[1]); /* Que pasa si la quito? */
wait(&estado);
/* Que pasa si la quito ? */
printf(El padre finaliza despues que el hijo\n);
exit(0);
}
else
{ /* proceso hijo , suma de 1 a dato*/
close(tuberia[1]);
suma = 0;
while (read(tuberia[0],&dato,sizeof(int))>0) suma=suma+dato;
close(tuberia[0]); /* Que pasa si la quito ? */
prinf(Suma calculada en el proceso hijo%d\n,suma);
exit(0);
}
76
#include <unistd.h>
int dup(desc_fich);
int desc_fich;
77
78
79
Devuelve:
-1 en caso de error.
0 en caso contrario.
Errores:
Si no se tienen permisos de ejecucin en los directorios de los caminos
(paths), permisos de escritura en los directorios o ficheros oportunos, etc.
Si algn parmetro est siendo usado al mismo tiempo por el sistema.
Si ToPath especifica un directorio no vaco, FromPath es directorio y
ToPath no FromPath es fichero y ToPath no.
Sistemas Operativos (IS11) Tema 1
80
81
Devuelve:
Devuelve la localizacin final del puntero en bytes medida desde el
inicio del fichero.
Devuelve -1 en caso de error. .
Errores:
Si FileDescriptor no corresponde a un fichero abierto.
Si FileDescriptor corresponde a una tubera abierta.
Si el offset sobrepasa el lmite permitido definido en OFF_MAX.
82
83
84
Errores:
Permiso denegado en alguno de los directorios del path.
Un componente del path no es un directorio.
No existe el fichero.
La
estructura
stat
/usr/include/sys/stat.h.
est
definida
en
el
fichero
estn
definidos
en
el
fichero
85
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
S_IRWXU
S_IRUSR
S_IWUSR
S_IXUSR
S_IRWXG
S_IRGRP
S_IWGRP
S_IXGRP
S_IRWXO
S_IROTH
S_IWOTH
S_IXOTH
0000700
0000400
0000200
0000100
0000070
0000040
0000020
0000010
0000007
0000004
0000002
0000001
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
86
#define
#define
#define
#define
#define
#define
S_IFMT
S_IFREG
S_IFDIR
S_IFBLK
S_IFCHR
S_IFIFO
0170000
0100000
0040000
0060000
0020000
0010000
/* type of file */
/*
regular */
/*
directory */
/*
block special */
/*
character special */
/*
fifo */
man 2 stat.
87
88
89
90
Devuelve:
-1 en caso de error.
0 en caso contrario.
Errores:
91
Devuelve:
-1 en caso de error.
0 en caso contrario.
Errores:
92
Devuelve:
-1 en caso de error.
0 en caso contrario.
Errores:
El acceso al nuevo directorio no est permitido (no se tienen permisos
adecuados)
Path no es un directorio.
93
Mercedes
Carlos
Julieta
94
95
96
if (((S_IRUSR)&(campo.st_mode))= =(S_IRUSR))
printf(De lectura para el propietario\n);
if (((S_IWUSR)&(campo.st_mode))= =(S_IWUSR))
printf(De escritura para el propietario\n);
if (((S_IXUSR)&(campo.st_mode))= =(S_IXUSR))
printf(De ejecucin para el propietario\n);
/*0000400*/
/*0000200*/
/*0000100*/
97
if (((S_IRGRP)&(campo.st_mode))= =(S_IRGRP))
printf(De lectura para el grupo\n);
if (((S_IWGRP)&(campo.st_mode))= =(S_IWGRP))
printf(De escritura para el grupo \n);
if (((S_IXGRP)&(campo.st_mode))= =(S_IXGRP))
printf(De ejecucin para el grupo \n);
/*0000040*/
/*0000020*/
/*0000010*/
/*PERMISOS OTROS*/
if (((S_IROTH)&(campo.st_mode))= =(S_IROTH))
printf(De lectura para otros\n);
if (((S_IWOTH)&(campo.st_mode))= =(S_IWOTH))
printf(De escritura para otros \n);
if (((S_IXOTH)&(campo.st_mode))= =(S_IXOTH))
printf(De ejecucin para otros \n);
/*0000004*/
/*0000002*/
/*0000001*/
98