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

Señales en c bajo linux, AYUDA POR FAVORRR!

Estas en el tema de Señales en c bajo linux, AYUDA POR FAVORRR! en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 01/04/2008, 04:33
 
Fecha de Ingreso: abril-2008
Mensajes: 6
Antigüedad: 16 años, 2 meses
Puntos: 0
Señales en c bajo linux, AYUDA POR FAVORRR!

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.

Me piden que envíe las señales desde consola con kill.....


GRACIAS POR LA AYUDA!!!
  #2 (permalink)  
Antiguo 01/04/2008, 12:34
Avatar de Mephisto  
Fecha de Ingreso: enero-2006
Ubicación: Mexico DF
Mensajes: 184
Antigüedad: 18 años, 4 meses
Puntos: 3
Re: Señales en c bajo linux, AYUDA POR FAVORRR!

Escribi algo que te pudiera ayudar en el mensaje de

Manejar señales en C
thepunishercadiz
__________________
Saludos...

Todos somos sabios, solo que en diferentes disciplinas...
  #3 (permalink)  
Antiguo 01/04/2008, 13:27
Avatar de Mephisto  
Fecha de Ingreso: enero-2006
Ubicación: Mexico DF
Mensajes: 184
Antigüedad: 18 años, 4 meses
Puntos: 3
Re: Señales en c bajo linux, AYUDA POR FAVORRR!

Cita:
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?

Lo primero es que como tu lo mencionas, al no tener tanta experiencia en C lo que te recomiendo es que vayas paso a paso y no quieras terminar el prog de un jalon ya que si no puedes llegar a la deseperacion, jejejej

Por lo que comentas de tu problema, yo lo separaria en los siguientes pasos.

1. Solicitar al usuario el nombre de un archivo

2. Buscar el archivo y desplegar su info (esto asegurando que el archivo exista)

3. Generar la señal para terminar el prog

4. Generar la señal para cuando el archivo no existe


Te recomendaria que fueras uno a uno, esto es que tu prog haga primero el paso 1, despues el 1 y el 2 y asi sucesivamente...

Con relacion al read y al write, estas son funciones para leer y escribir en archivos, cualquier mensaje que requieras enviarle al usuario o recibirlo de el empleas printf y scanf.

Te mando esta liga que espero te sirva en el uso de esas funciones

http://blog.txipinet.com/2006/10/26/...gnu-linux-iii/
__________________
Saludos...

Todos somos sabios, solo que en diferentes disciplinas...
  #4 (permalink)  
Antiguo 01/04/2008, 14:50
 
Fecha de Ingreso: abril-2008
Mensajes: 6
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Señales en c bajo linux, AYUDA POR FAVORRR!

Gracias!; mira he corregido el código un poco, estoy mas o menso en las misma, pero mas o menso intento utilizar el sprintf de manera correcta(creo...) e implemente lo que me dijiste de las señales SIGUSR1 y y SIGTERM, nose, puedes echarle un ojo porfas!!!!!?

GRACIAS!




#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 SIGUSR1Handler(int sig){
printf("Se ha recibido señal: %d SIGUSR1, continuo, escribir un nuevo nombre de archivo \n",sig1);

}

void SIGTERMHandler(int sig){
printf("Se termina la ejecucion de este prog");
exit(0);

}

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






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

stat ("fichero.txt", &buf);

char filen[_MAX_PATH];
char cad[50];
int res;
int lee;
int i;

signal(SIGTERM,SIGTERMHandler);
signal(SIGUSR1,SIGUSR1Handler);

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


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


if( (filen = open( argv[1], O_RDWR )) == -1 )
{
perror( "open" );
exit( -1 );
}


while( (lee = read( filen, buffer, SIZE )) != 0 )
{
write( STDOUT, buffer, lee );
}

close( fd );

return 0;
}


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


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

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



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

pause();


if (signal(SIGUSR1,SIGUSR1Handler); < 0)
{error("error");
else
(siganl(SIGTERMHandler); <0)
error("error");

}


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


}
}
};


N
  #5 (permalink)  
Antiguo 01/04/2008, 15:54
 
Fecha de Ingreso: marzo-2008
Mensajes: 37
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Señales en c bajo linux, AYUDA POR FAVORRR!

Read y Write no solo sirven para escribir/leer en ficheros de los de toda la vida, por ejemplo hola.txt etc..., sino que tambien se pueden redirigir a los 3 descriptores estandar.

Por ejemplo, si no se han redefinido otros descriptores estandart(de los que arranca el programa, 0->entrada estandar, 1-> salida estandart, 2-> error estandart) puede leerse de la terminal perfectamente con:

read(0,buffer,sizeof(buffer)) <- lee de la entrada estandar, es decir, el teclado. Esto ocurre porque la tty tambien es un fichero.

Aunque como Mephisto dijo, es mejor usar printf, fgets, etc, para mostrar/coger, ya que es un poco tosquillo hacerlo con write/read, aunque poder se puede jeje

Y sprintf, en algunas lineas, lo estas implementando mal, digamos que sprintf sirve para formar una ruta, cadena etc..

#
Código:
include <stdio.h>

int
main()
{

char pepe[]="Hola";
char pepo[]="Adios";
char juntos[80]; //ojo con esto, si se le mete mas da overflow

sprintf(juntos,"%s/%s",pepe,pepo);

printf("%s\n",juntos);

return 0;

}
Y da como resultado: Hola/Adios

Saludos

Última edición por Leber; 01/04/2008 a las 16:00
  #6 (permalink)  
Antiguo 01/04/2008, 17:00
 
Fecha de Ingreso: abril-2008
Mensajes: 6
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: Señales en c bajo linux, AYUDA POR FAVORRR!

:(, ya me volvi a perder.. voy a mirar el cídgo otra vez..

Gracias!
  #7 (permalink)  
Antiguo 01/04/2008, 17:27
Avatar de Mephisto  
Fecha de Ingreso: enero-2006
Ubicación: Mexico DF
Mensajes: 184
Antigüedad: 18 años, 4 meses
Puntos: 3
Re: Señales en c bajo linux, AYUDA POR FAVORRR!

Como te mencionaba en el mensaje anterior, cuando uno comienza a programar, hay que ser un poco paciente e ir poco a poco, ya que veo que estas haciendo todo el prog y a veces es dificil que salga a la primera, te recomiendo que primero pruebes la lectura del nombre del archivo que introduce el usuario.

Esto te lo menciono porque esxite una "contradiccion" en tu codigo para este punto. Dejare momentaneamente lo de las señales a un lado. Voy por partes y espero explicarme bien.

Enfocandose en la lectura del nombre del archivo por parte del usuario:

Código:
main(int argc, char *argv[])
argv almacena los parametros que se mandan al ejecutar un prog y argc nos indica el numero de parámetros que se emplearon. Si el usuario tiene que enviar el nombre del archivo desde que lo ejecuta se emplearán los valores en argv, por ejemplo

Miprog Archivo.txt

Con esto desde que ejecuto el prog ya estoy recibiendo el nombre del archivo, pero si lo que quiero es que primero se ejecute el prog y despues que me solicite el nombre del archivo a buscar, lo haremos con read y write, creo que este es el caso que necesitas. Considerando esto:

Código:
stat ("fichero.txt", &buf);
Esta linea la tienes en la parte donde defines las variables, no es incorrecto pero es una buena practica de programacion primero definir las variables y despues ya todo el código de ejecución. Habría que moverla de lugar

Código:
for (i=1; i < argc ; i++)
Este for creo que lo obtuviste de otro código de ejemplo, generalmente se emplea para rcorrer cada uno de los parámetros que se envia al invocar el prog pero en tu caso el valor que requieres lo obtendras en la ejecución, no en la llamada, por lo que habría que eliminarlo

Código:
sprintf ("Nombre del archivo: ");
Como te menciono sprintf sirve para mandar a un stream la cadena y o a la pantalla, ya que solo puedes usar read y write cambiala por

Código:
write(1,"Nombre Archivo:\n",strlen(Nombre Archivo:\n));
read(0,filen,sizeof(filen));
Por otro lado

Código:
if( (filen = open( argv[1], O_RDWR )) == -1 )
La variable filen la declaras como un array de char para almacenar el nombre que de el usuario del archivo a buscar, la función open regresa un apuntador a un archivo, por lo cual requieres definir una variable FILE *ptrfile; y el valor filen iria en el lugar de argv[1] ya que como te decia, este parametro lo recbirias si desde la invocacion del prog le mandas el valor del archivo.

Realmente te aconsejaria que fueras paso a paso, existen varios errores de sintaxis en el prog que posteaste, por que no empiezas paso a paso, primero haz el prog que lea el nombre del archivo. No elimines este codigo ya que vas a emplear varias partes.
__________________
Saludos...

Todos somos sabios, solo que en diferentes disciplinas...
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 07:56.