当我尝试从 C++ 中的子 POSIX 线程打开 /proc/net/tcp 时,它失败并出现“没有这样的文件或目录”错误。如果我尝试从父线程打开它,它每次都会成功,并且在父线程中打开/关闭它的过程也会使它在子线程中成功大约三分之一的时间。我可以在 100% 的时间内在子线程中打开 /proc/uptime 而不会出现问题。下面是一些可以使用“g++ -Wall test.cc -o test -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 上使用 Intel i5-2520M(2 个内核 * 2 个虚拟内核)的 Ubuntu 12.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$
可能值得注意的是,如果我使用 fork 而不是 posix 线程,我就没有这个问题。如果我使用fork,那么子进程读取/proc/net/tcp没有问题
只需输入几个数据点......看起来这是 Linux 中的回归,因为 2.6.35 似乎 100% 的时间都在工作。3.2.0 大部分时间都在呕吐,即使在我基于 Pentium M 的旧笔记本电脑上也是如此。