Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Manejar señales en C

Estas en el tema de Manejar señales en C en el foro de C/C++ en Foros del Web. Buenas tardes. A ver si alguien puede echarme una mano con esto: Resulta que debo enviar señales desde el teclado para hacer cosas con un ...
  #1 (permalink)  
Antiguo 10/10/2007, 09:19
 
Fecha de Ingreso: octubre-2007
Mensajes: 7
Antigüedad: 17 años, 2 meses
Puntos: 0
Manejar señales en C

Buenas tardes.

A ver si alguien puede echarme una mano con esto:

Resulta que debo enviar señales desde el teclado para hacer cosas con un fichero:

1. Si el fichero no existe, lo creo vacío.

2. Si el fichero existe, se bloquea el programa y espera una señal desde el teclado
con kill, si se recibe SIGUSR1 sobreescribe el fichero, y si recibe SIGUSR2 no hace nada.

Los manejadores para hacer cada cosa según la señal los tengo hechos, pero cómo puedo mandar una señal desde el teclado sin usar el scanf????

int main() {

int result, vacio;
char c[180];
char sig[80];

if ((result=open("resultado.dat",O_RDONLY)) < 0) {
/* Puede ser que el fichero no exista, en ese caso lo creo vacío*/
sprintf(c,"El fichero no existe, voy a crearlo vacío\n");
write(2,c,strlen(c));
vacio = open("resultado.dat",O_WRONLY|O_CREAT,0600);
close(vacio);
}

else { /*El fichero existe*/
sprintf(c,"Fichero existente. Escribir kill -12 para acabar, kill -10 para seguir\n");
write(2,c,strlen(c));

scanf("%s",sig); DE AQUÍ EN ADELANTE ES DONDE TENGO EL PROBLEMA

if(strcmp(sig,"kill -12")){
/*sigusr2 no debo hacer nada*/
close(result);
signal(SIGUSR2,quehagosigusr2); /*sigusr2 no debo hacer nada*/
}
if(strcmp(sig,"kill -10")){
/*sigusr1 tengo sobreescribir fichero*/
close(result);
signal(SIGUSR1,quehagosigusr1); /*sigusr1 tengo sobreescribir fichero*/
}

}



}

Muchas gracias por vuestra ayuda.
  #2 (permalink)  
Antiguo 12/10/2007, 07:56
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
Re: Manejar señales en C

¿lol?

Lo más probable es que tu profesor te haya mandado mandar la señal desde otra terminal usando kill(1), no que leas una cadena que ponga "kill"; para después tu programa actuar en consecuencia.

Digo yo...
  #3 (permalink)  
Antiguo 01/04/2008, 05:00
 
Fecha de Ingreso: abril-2008
Mensajes: 6
Antigüedad: 16 años, 9 meses
Puntos: 0
señales en c, ayuda por favor!

Hola, soy inexperta en programación y tengo que entregar la siguiente práctica mañan, porfavor si alguién puede echarme un cable se lo agradezco muchísimo!.

Lapráctica consiste en realizar una aplicación (en c bajo linux) que pregunte al usuario el nombre de un archivo, entonces verificará su existencia, si este existe informara por pantalla el tipo de archivo que es, así como su tamaño e identificador del propietario.
Si el archivo no existe, entonces se quedara en la espera de una señal. si Recibe la señal SIGUSR1, el programa escribirá un mensaje de continaución y continuará ejecutandose pidiendo de nuevo el nombre del archivo.

La aplicación termina al recibir una señal SIGTERM, en este caso escribirá un mensaje de despedida y terminará.

Como mencione soy inexperta asi que intentando realizar el código tengo mas o menso lo siguiente, peor se que está todo incoherente, por favor ayudarme que es urgente, GRACIAS DE ANTEMANO!!!


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


void continuo (int sig1){
int filen;
char c [60];

sprintf(c,"Se ha recibido señal: %d SIGUSR1, continuo, escribir un nuevo nombre de archivo \n",sig1);
write(2,c,strlen(c));

exit(0);







main(int argc, char *argv[])
{
int señal;
struct stat buf;

char filen[_MAX_PATH];
int res;


for (i=1; i < argc ; i++)


sprintf ("Nombre del archivo: ");
gets (filen);

if (write (1, "SI existe el archivo\n", strlen("SI existe el fichero\n")) < 0)
error("Error d'escriptura stdout");


{
sprintf("%s\n",argv[0]);

if ( stat(argv[i], &buf) == -1 )
{
perror(argv[0]);
exit(-1);
}
else
{
sprintf("Tamaño del archivo %s %d bytes.\n",argv[0],buf.st_size);
sprintf("Propietario %s .\n", argv[0], buf.st_uid);
sprintf("Tipo de Fichero %d\n", buf.st_mode);
}



else
{ sprintf("NO existe el archivo\n");

pause();


if (signal (SIGUSR1, gestor) < 0)
{error("Programació SIGUSR1 amb error");




if (sig == 10){
signal(señal,continuo);

}


kill(getpid(),señal);
exit(0);


}
}
};


NOTA: he de implementar la llmada al sistema STAT para listar los datos del archivo. asi como read, write, signal y pause. POr favor echarme una mano en l o que sea que me vendra muy bien, gracias!!!
  #4 (permalink)  
Antiguo 01/04/2008, 12:32
Avatar de Mephisto  
Fecha de Ingreso: enero-2006
Ubicación: Mexico DF
Mensajes: 184
Antigüedad: 19 años
Puntos: 3
Re: Manejar señales en C

Yo te puedo dar algunas observaciones que espero te puedan ser utiles..

1. Defines la funcion que realizará el manejo de SIGUSR1. Esta es la que tienes como continuo

Código:
void SIGUSR1Handler(int sig){
   printf("Se ha recibido señal: %d SIGUSR1, continuo, escribir un nuevo nombre de archivo \n",sig1);

}
Al utilizar sprintf lo que haces es mandarlo hacia un array y lo que quieres es mostrar el mensaje en la pantalla por lo que usamos printf

2. Defines tambien la funcion que realizara el manejo de SIGTERM.
Código:
void SIGTERMHandler(int sig){
   printf("Se termina la ejecucion de este prog");
   exit(0);

}
3. En el main das de alta el manejo de estos dos signals mediante
Código:
                 signal(SIGTERM,SIGTERMHandler);
                 signal(SIGUSR1,SIGUSR1Handler);
4. Todo lo que quieras que aparezca en la pantalla lo realizas empleando printf, ya que como te mencionaba mendiante sprintf la salida la envias a un array...

Cita:
sprintf("Tamaño del archivo %s %d bytes.\n",argv[0],buf.st_size);
sprintf("Propietario %s .\n", argv[0], buf.st_uid);
sprintf("Tipo de Fichero %d\n", buf.st_mode);

5. Habria que hacer algunos otros ajusten al main pero lo que te menciono es para darle mas forma a tu prog.

Espero te sirva...
__________________
Saludos...

Todos somos sabios, solo que en diferentes disciplinas...
  #5 (permalink)  
Antiguo 01/04/2008, 12:49
 
Fecha de Ingreso: abril-2008
Mensajes: 6
Antigüedad: 16 años, 9 meses
Puntos: 0
Re: Manejar señales en C

Hola, priemro que nada MUCHÍSIMAS GRACIAS POR RESPONDERME.

Estoy irando elcódigo, la cuesitón es que tengo precisamente un lío porque ya vi bien, he de emplear el "read y el write" en lugar del printf y eso, lo del sprinti pues si está mal, pero he de emplear el read y write..., alguna idea?


Gracias!!!
  #6 (permalink)  
Antiguo 01/04/2008, 13:10
Avatar de Mephisto  
Fecha de Ingreso: enero-2006
Ubicación: Mexico DF
Mensajes: 184
Antigüedad: 19 años
Puntos: 3
Re: Manejar señales en C

Te contesto en tu tag ya que este es de otra persona y nos estamos colgando de su duda, jejejejejej
__________________
Saludos...

Todos somos sabios, solo que en diferentes disciplinas...
  #7 (permalink)  
Antiguo 01/04/2008, 13:18
 
Fecha de Ingreso: abril-2008
Mensajes: 6
Antigüedad: 16 años, 9 meses
Puntos: 0
Re: Manejar señales en C

ok gracias!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:01.