C/Visual C - errno EMFILE (23)

 
Vista:

errno EMFILE (23)

Publicado por anacara (3 intervenciones) el 20/03/2007 12:02:38
Hola!

Tengo un servidor C que lanza hebras que se comunican con un cliente remoto por medio de sockets. Al leer de los sockets me aparece el error número 23 (EMFILE), que significa "demasiados archivos abiertos en el sistema". Supongo que se debe a que cada hebra tiene su propio socket y cada descriptor de socket es un descriptor de fichero.

¿Puedo ignorar este error o me provocará problemas más adelante?

Por otra parte, cuando desconecto las hebras (cerrando los correspondientes sockets), el resto de hebras se vuelven un poco "tontas" y no responden a las peticiones que les envío... no sé si tendrá algo que ver con el error EMFILE o es otra cosa.

Muchas gracias
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:errno EMFILE (23)

Publicado por Tom (27 intervenciones) el 20/03/2007 14:20:32
Pues, tú verás, pero yo tomaría en cuenta ese error. Si estás currando con sockets y resulta que te da un error al abrirlos, pero pasas de él ...
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:errno EMFILE (23)

Publicado por anacara (3 intervenciones) el 20/03/2007 14:28:55
Creo que he planteado mal la pregunta... No quiero ignorar sin más el error, lo que pasa, es que no entiendo mucho qué implicaciones tiene el hecho de tener varios ficheros abiertos ni qué cantidad considera el sistema como muchos, pues el error aparece con cuatro sockets abiertos y la aplicación es un servidor que dará servicio a muchos clientes...

Vaya, que no le veo remedio al tener los sockets abiertos...

Hay alguna otra opción?
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:errno EMFILE (23)

Publicado por Tom (27 intervenciones) el 20/03/2007 16:33:14
El S.O. limita el máximo número de ficheros abiertos por un proceso. Este número es configurable, hasta cierto punto.

Con cuatro no debería darte ese error, desde luego (no sé sobre que S.O. trabajas, pero 512 ficheros simultáneamente es un valor normal); lo más posible es que nunca cierres ningún fichero, o que tengas muchos más threads lanzados de los que piensas.

De cualquier modo, ese error significa que no ha podido abrir el último fichero.

Si usas Linux, mira el man de getrlimit()
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:errno EMFILE (23)

Publicado por anacara (3 intervenciones) el 20/03/2007 18:58:58
Uso Linux, con Fedora Core (creo que la última versión). He comprobado el límite para el número de ficheros con getrlimit y es 1024, por lo que tiene toda la pinta de que mis hebras hacen algo que yo ignoraba...

Existe alguna forma de saber cuántos descriptores de ficheros hay abiertos en un momento dado? He visto la función getrusage(), pero entre los datos que proporciona creo que no se incluye este...

Por cierto, muchas gracias por tus respuestas
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:errno EMFILE (23)

Publicado por Tom (27 intervenciones) el 21/03/2007 08:08:19
Pues yo no conozco ninguna manera, aunque pueda que haya alguna vía, indirecta, para conocer tu número de descriptores ...
Me temo que tendrás que poner trazas en tu programa.

Yo haría las aperturas y cierres de ficheros en una función. Esto te permitiría llevar el control, y es relativamente rápido de implementar, ya que puedes buscar en tus fuentes todos los sitios donde haces open(), fopen(), socket() y demás y cambiar esa llamada por otra a tu nueva función.
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:errno EMFILE (23)

Publicado por Nelek (816 intervenciones) el 21/03/2007 09:00:34
Hola,

Yo no programo bajo linux asi que puede que lo que diga sea una barbaridad. Pero leyendo la respuesta de Tom, se me ha ocurrido una cosilla, aunque no se si servira.

Cada vez que abras una nueva hebra o fichero, ponte puntos de interrupcion mediante cuadros de dialogo y te muestras los datos que necesites usando variables intermedias, es mucha faena y tendras que ir pasando secuencialmente por casi todo tu programa, pero...

A mi me pasaba algo parecido en VC++ con memory leaks y, a pesar de haber puesto todos los delete para los punteros seguia recibiendolos. Usando ese metodo acabe dando con el punto que me desmadraba el sistema y lo solucione de una manera muy sencilla.

Y si una de las funciones no te da los datos que necesitas, investiga un poco y te sobreescribes tu propia funcion. Yo lo hice con un par de las funciones dentro de las MFC (concretamente en los AfxTempl.h). Es peligroso, pero con paciencia y cuidado (haz copias de seguridad de las carpetas donde esten tus ficheros "core" o librerias estandard) podras arreglarlo o conseguir los datos que necesites
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