C++で子POSIXスレッドから/proc/ net / tcpを開こうとすると、「そのようなファイルまたはディレクトリはありません」というエラーで失敗します。親スレッドから開こうとすると毎回成功し、親スレッドで開閉するプロセスで子スレッドでも約3分の1の確率で成功します。子スレッドで/proc/ uptimeを100%問題なく開くことができます。「g++-Wall test.cc-otest-pthread」でコンパイルできるサンプルコードを次に示します。
#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);
}
Linuxカーネル3.2.0上のInteli5-2520M(2コア* 2仮想コア)を搭載したUbuntu12.04ボックスでこれを実行しています。上記のコードを6回続けて実行した私の出力は次のとおりです。
mike@ung:/tmp$ ./test
Succeeded
Failed - No such file or directory
mike@ung:/tmp$ ./test
Succeeded
Succeeded
mike@ung:/tmp$ ./test
Succeeded
Failed - No such file or directory
mike@ung:/tmp$ ./test
Succeeded
Failed - No such file or directory
mike@ung:/tmp$ ./test
Succeeded
Succeeded
mike@ung:/tmp$ ./test
Succeeded
Failed - No such file or directory
mike@ung:/tmp$
posixスレッドの代わりにフォークを使用すれば、この問題は発生しないことに注意してください。フォークを使用する場合、子プロセスは/ proc / net/tcpの読み取りに問題はありません。
投入するデータポイントはほんの2、3です。2.6.35は100%動作しているように見えるため、これはLinuxでのリグレッションのようです。3.2.0は、私の遅い古いPentiumMベースのラップトップでもほとんどの場合吐き出します。