C/Visual C - signal

   
Vista:

signal

Publicado por Katerina (5 intervenciones) el 01/04/2016 09:46:35
Hola, tengo que hacer un programa que cuando pulse CTRL+C termine con el programa, pero antes debe eliminar los recursos utilizados. ¿Cómo podría pasar los parámetros a function para eliminar los recursos antes de utilizar SIGTERM? Si no pulso CTRL+C, el programa debe eliminar también los recursos. Gracias de antemano.

1
2
3
4
5
6
7
8
9
int main()
{
   signal(SIGINT, funcion);
}
 
void funcion(int h)
{
   raise(SIGTERM);
}
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

signal

Publicado por Tom (475 intervenciones) el 01/04/2016 10:32:17
No eliminas recursos, los liberas o desbloqueas. Para ello me temo que no tienes más remedio que mantener sus descriptores o punteros con visiblidad global.
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

signal

Publicado por aguml (173 intervenciones) el 01/04/2016 11:44:02
O eso o usas clases y pones a estos en privado y así solo podría accederse desde la clase.
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

signal

Publicado por Martín (9 intervenciones) el 01/04/2016 18:51:11
En C++ lo más usual es el idiom RAII (Resource Acquisition is Initialisation), que a pesar de su nombre se usa para exactamente esto que estás necesitando; liberar los recursos que hayas tomado.

El problema con estas signals es que son una forma anormal de terminar un programa, y los constructores no van a invocarse; pero las funciones que van a manejar estas señales (los signal handlers) pueden establecer una condición de salida y dejar que el programa termine normalmente. Pongo un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <csignal>
#include <iostream>
#include <fstream>
#include <atomic>
 
namespace
{
	std::atomic<bool> salir = false;
}
 
void funcion(int h)
{
	std::cout << "SIGINT handler.\n";
	salir = true; // sólo pone la señal de salida
}
 
class Unaclase {
public:
	Unaclase() {
		std::cout << "abriendo el archivo.\n";
		archivo.open("raii.txt");
	}
	~Unaclase() {
		std::cout << "cerrando el archivo.\n";
		archivo.close();
		std::cin.get();  // presiona Enter para continuar
	}
private:
	std::ofstream archivo;
};
 
int main()
{
	signal(SIGINT, funcion);
 
	while (!salir) {
		// lo que haga el programa va aquí
		// ...
 
		Unaclase uc{};
 
		if (salir) break;
	}
}
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

signal

Publicado por Martín (9 intervenciones) el 01/04/2016 19:34:21
"... El problema con estas signals es que son una forma anormal de terminar un programa, y los constructores no van a invocarse..."
Ejém... quise decir ... y los destructores no van a invocarse"
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

signal

Publicado por Chema (187 intervenciones) el 01/04/2016 22:28:12
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