C++ std::of流构造函数阻塞
我有以下代码:C++ std::of流构造函数阻塞,c++,linux,gcc,gdb,centos,C++,Linux,Gcc,Gdb,Centos,我有以下代码: std::ofstream stat("/opt/lic_status"); if ( stat.is_open() ) { stat << ver; stat.close(); } std::of Stream stat(“/opt/lic_status”); 如果(状态为打开()) { 斯达 “我需要指出的是,我不知道当时的状态是什么 /opt/lic_status文件。我不知道它是由其他进程打开的,还是根本不存在。” 根据我的理解,文件的上述属
std::ofstream stat("/opt/lic_status");
if ( stat.is_open() )
{
stat << ver;
stat.close();
}
std::of Stream stat(“/opt/lic_status”);
如果(状态为打开())
{
斯达
“我需要指出的是,我不知道当时的状态是什么
/opt/lic_status文件。我不知道它是由其他进程打开的,还是根本不存在。”
根据我的理解,文件的上述属性/状态都不能导致程序在该特定行上阻塞(.e.即用户模式程序在std::of stream
构造函数内调用open()
)。每当用户模式程序调用open()时
系统调用打开文件时,系统将使用适当的错误代码完成调用。系统(内核模式)不会返回到用户模式
有没有人对造成这种情况的原因有任何建议?我
只有coredump,我能从中得到任何信息吗
整个系统(内核)未处于良好状态(由于未知原因)
程序是多线程的,其他一些线程被卡在了某个地方。通过查看此线程的调用堆栈,当它在内核模式下执行并调用open()
如果我们遇到第一种情况,那么我相信我们不能做太多,程序的核心转储文件不会提供任何额外信息来识别/确认这一点。核心转储文件只包含该特定进程的快照
然而,如果我们是第二种情况,那么我们应该尝试进一步分析核心转储文件
$info threads
$thread apply all backtrace
上面的命令将提供信息(如果您的程序是多线程的)以及调用所有线程的堆栈。这可能有助于理解您的问题。如果您已经这样做了,您可以忽略上面的信息。您可以重现问题吗?我不这么认为。如果我可以重现它,我可以得到什么信息?谢谢您的回答。事实上,我还有其他线程(大约40个),并且大多数线程都被阻塞了(如预期的那样)。另一个线程的状态如何影响open()系统调用的行为?现在我们在两台不同的机器上两次解决了完全相同的问题。这可能是内核问题吗?根据我的理解,应该是用户模式程序问题(而不是内核问题)。您应该尝试分析其他线程的调用堆栈,并仔细理解它们。理想情况下,没有线程能够影响您的open()系统调用线程,这可能是其他线程状态的受害者。最终您必须弄清楚:)。最好的。这也可能是内核级的问题。但在这种情况下,其他一些程序(除了当前的)或整个系统应该会很慢……这也是我根据自己的理解和经验做出的猜测。
$info threads
$thread apply all backtrace