Linux - Dudas con llamadas al sistema

 
Vista:

Dudas con llamadas al sistema

Publicado por Migue (2 intervenciones) el 24/09/2007 19:34:52
Muy buenas tardes.

He encontrado este foro que espero me sirva de ayuda. Quisiera hacer la siguiente consulta:

Hay un fichero, el cual antes de crearse debe comprobarse que existe. Si existe hay que mostrar un mensaje de error y se bloqueará el programa con la señal pause(). Para desbloquear el proceso hay que enviar las señales SIGUSR1 y SIGUSR2.

Si se recibe SIGUSR1, se reescribe el fichero (leer datos de dos ficheros de entrada y llenar el fichero de salida con la multiplicación de los registros de ambos) y se acaba el proceso
Si se recibe SIGUSR2, no se modifica el fichero y se acaba el proceso

Las señales las hay que enviar desde la consola con kill.

Espero podáis solucionarme la duda, porque estoy un poco desesperado. Es lo único que me falta para poder acabar el programa.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Dudas con llamadas al sistema

Publicado por Tom (482 intervenciones) el 25/09/2007 08:19:57
Vale. ¿ Cual es tu duda ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dudas con llamadas al sistema

Publicado por Migue (2 intervenciones) el 25/09/2007 08:52:17
Pues mi duda es que no se de qué manera debo capturar las señales.

Gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dudas con llamadas al sistema

Publicado por n0str0m0 (1503 intervenciones) el 25/09/2007 15:40:45
man signal.

Con esa función especificas qué código quieres ejecutar cuando tu programa reciba qué señal.

Salu2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dudas con llamadas al sistema y problema

Publicado por Migue (4 intervenciones) el 04/10/2007 19:01:19
Sigo medio majareta con el tema de las señales, esto es lo que se supone que debe hacer el programa.

Tengo dos ficheros con enteros, y otro para almacenar el resultado.

Debo comprobar que si el fichero existe, el programa se bloquea con pause y espera una señal, si es sigusr1 que sobreescriba el fichero y si es sigusr2 que no haga nada.

Por favor, a ver si podeis echarme un cable porque estoy desesperado y tengo que entregar la práctica el proximo jueves 11. Gracias!!

Este es el código que he escrito:

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

void error (char *m) {
write(2,m,strlen(m));
write(2,"\n",1);
write(2,strerror(errno),strlen(strerror(errno)));
exit(1);
}

void quehagosigusr2 (int sig2){ /*gestor para determinar qué hacer en caso de que la señal recibida sea sigusr2*/

printf("No voy a hacer nada con el fichero\n");
fflush(stdout); /*limpio los restos que pudiera haber en el buffer de salida*/
}

void quehagosigusr1 (int sig1){ /*gestor para determinar qué hacer en caso de que la señal recibida sea sigusr1*/

int data1, data2, resultado; /*punteros para tratar los ficheros*/
int dato1, dato2,resul; /*los datos que leeré y escribiré en los ficheros*/
int contamulti; /*aquí guardaré el número de multiplicaciones realizadas*/
long index1, index2; /*me ayudarán a moverme por los ficheros, index1 hacia adelante, index2 hacia atrás*/
char s [80]; /*cadena para formatear y mostrar posteriormente el número de operaciones realizadas*/

/*compruebo que no hay problemas en los ficheros de lectura*/
if ((data1 = open("data1.dat",O_RDONLY)) < 0)
error("Fallo al abrir data1.dat");
if ((data2= open("data2.dat",O_RDONLY)) < 0)
error("Fallo al abrir data2.dat");
/*voy a sobreescribir el fichero resultado.dat*/
if((resultado=open("resultado.dat",O_WRONLY|O_CREAT|O_TRUNC,0600)) < 0)
error("Hubo un problema al abrir el fichero para escribir");

index1=lseek(data1,1,SEEK_SET); /*me posiciono al principio del primer fichero*/
read(data1,&dato1,sizeof(dato1));
index1 ++;
index2 = lseek(data2,0,SEEK_END); /*me posiciono al final del segundo fichero para leerlo*/ /*al revés*/
read(data2,&dato2,sizeof(dato2));
index2 --;

while ((index1 >=1) && (index2 >=0)) {
resul = dato1*dato2;
contamulti ++;
write(resultado,&resul,sizeof(resul));
read(data1,&dato1,sizeof(dato1));
index1 ++;
read(data2,&dato2,sizeof(dato2));
index2 --;
} /*while*/

/*formateo la cadena previamente para mostrarla después por la salida estándar*/
sprintf(s,"El número de multiplicaciones es: %d \n",contamulti);
/*muestro el resultado por la salida estandar*/
write(2,s,strlen(s));
fflush(stdout); /*limpio el buffer de salida*/
/*cierro todos los ficheros*/
close(data1);
close(data2);
close(resultado);

}

int main() {

int result;

/*debo preguntar si el fichero de resultado existe previamente*/

if ((result= open("resultado.dat",O_RDONLY)) > 0 ){ /*existe y no hago nada*/
error("fichero existente");
signal(SIGUSR2,quehagosigusr2); /*si mando sigusr2 no debo hacer nada*/
pause();
close(result);
exit(1);
}
else {
signal(SIGUSR1,quehagosigusr1); /*si mando sigusr1 tengo que sobreescribir el fichero*/
error("Voy a sobreescribir el fichero");
pause();
}

}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dudas con llamadas al sistema y problema

Publicado por Tom (482 intervenciones) el 04/10/2007 21:43:36
"Debo comprobar que si el fichero existe, el programa se bloquea con pause y espera una señal, ..."

int main() {
int result;
if ((result= open("resultado.dat",O_RDONLY)) >= 0 ){
close(result);
signal(SIGUSR1, quehagosigusr1);
signal(SIGUSR2, quehagosigusr2);
pause();
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dudas con llamadas al sistema y problema

Publicado por Migue (1 intervención) el 05/10/2007 19:52:08
Muchas gracias, probaré y ya te cuento!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar