Cuando intento abrir/proc/net/tcp desde un subproceso secundario POSIX en C++, falla con un "No dicho archivo o directorio" error. Si intento abrirlo desde el hilo padre, éste se ejecuta correctamente, y el proceso de abrirlo/cerrarlo en el hilo padre lo hace tener éxito aproximadamente un tercio del tiempo en el hilo secundario también. Puedo abrir/proc/uptime en el hilo hijo el 100% del tiempo sin problema. Aquí hay un código de ejemplo que puede ser compilado con "-pthread g ++ -Wall -o test.cc prueba":Apertura/proc/net/tcp en C++ de un subproceso POSIX falla la mayor parte del tiempo
#include <iostream>
#include <fstream>
#include <cstring>
#include <cerrno>
#include <pthread.h>
using namespace std;
void * open_test (void *)
{
ifstream in;
in.open("/proc/net/tcp");
if (in.fail())
cout << "Failed - " << strerror(errno) << endl;
else
cout << "Succeeded" << endl;
in.close();
return 0;
}
int main (int argc, char * argv[])
{
open_test(NULL);
pthread_t thread;
pthread_create(&thread, NULL, open_test, NULL);
pthread_exit(0);
}
Estoy funcionando esto en una caja de Ubuntu 12.04 con un i5-2520M Intel (2 núcleos * 2 núcleos virtuales) en Linux kernel 3.2.0. Aquí está la salida de mí que ejecuta el código anterior 6 veces consecutivas:
[email protected]:/tmp$ ./test
Succeeded
Failed - No such file or directory
[email protected]:/tmp$ ./test
Succeeded
Succeeded
[email protected]:/tmp$ ./test
Succeeded
Failed - No such file or directory
[email protected]:/tmp$ ./test
Succeeded
Failed - No such file or directory
[email protected]:/tmp$ ./test
Succeeded
Succeeded
[email protected]:/tmp$ ./test
Succeeded
Failed - No such file or directory
[email protected]:/tmp$
Es probablemente la pena señalar que no tengo este problema si uso tenedor en lugar de los hilos POSIX. Si uso fork, entonces el proceso hijo no tiene problemas para leer/proc/net/tcp
Solo un par de puntos de datos para arrojar ... Parece que esto es una regresión en Linux ya que parece que 2.6.35 para trabajar el 100% del tiempo 3.2.0 vomita la mayor parte del tiempo, incluso en mi lenta computadora portátil basada en Pentium M.
¿Has probado con un núcleo 3.4.4? –
@BasileStarynkevitch Puedo reproducir eso en 3.4.4 –
@MikeCardwell, ¿ha considerado archivar esto como un error contra el kernel de Linux? –