#include <iostream>
#define LOGFATAL(msg) log(0, msg)
std::ofstream *logst = NULL;
void log(int sev, char *msg)
{ if (logst == NULL) {
logst = new std::ofstream();
logst->open("filea.txt", std::ios::out | std::ios::app);
*logst << "Logger started." << std::endl;
}
std::ofstream &_log = *logst;
_log << msg << std::endl;
_log.flush();
}
int main()
{ LOGFATAL("Log msg1.");
LOGFATAL("Log msg2.");
LOGFATAL("Log msg3.");
logst->close();
delete logst;
}
我正在打开一个文件,用于记录我第一次登录并继续保持打开状态直到程序结束。
由于我在每次日志调用后都使用flush()
操作,因此我希望看到我的消息立即打印出来。但这不是发生的事。为什么?
目前,我在完成之前使用 Ctrl + C 终止我的程序(不要问我为什么)。在程序的后续运行中,我甚至看不到创建日志文件,即使它已经存在,我也看不到添加的日志。由于我不让close()
执行,文件描述符是否会泄露并阻止新程序的未来open()
失败?
我在RHEL 7.2上运行它,我假设这些天大多数新操作系统处理,即使close()
没有被意外调用。考虑 Ctrl + C 是目前停止我的程序的唯一方法,我该怎么做才能让我的程序每次启动都能正确记录?
是否有办法从系统shell检查我的日志文件中是否有泄漏的文件描述符?
答案 0 :(得分:1)
插入For rowIndex = 0 To DataGridView1.RowCount - 1
Dim rValue = DataGridView1.Rows(rowIndex).Cells("AC_RECEIVEDDT").Value
If DateTime.TryParse(rValue, received) Then
difference = today.Subtract(received)
If difference.Days < 2 Then
DataGridView1.Rows(rowIndex).Cells("img").Value = My.Resources.green
ElseIf difference.Days = 2 Then
DataGridView1.Rows(rowIndex).Cells("img").Value = My.Resources.yellow
Else
DataGridView1.Rows(rowIndex).Cells("img").Value = My.Resources.red
End If
Else
MessageBox.Show("not a DateTime")
End If
Next
本身会刷新数据。即使std::endl
被评论,它也适用于我。
“我希望我的消息能够立即打印出来”。如果您使用_log.flush();
,则需要关闭并重新打开该文件。因此,如果数据写入文件,请使用vim
立即查看输出。
答案 1 :(得分:0)
采取以下步骤验证一些假设:
1。)将文件改为std::fstream
。写入第一条日志消息后,将文件指针重置为开头并读取文件的内容。 您应该从打开的文件中获取日志消息。如果没有,那么您可能会损坏内存。
2.。)写完第一条日志消息后,用std::ifstream
打开文件并阅读其内容。 您应该从std::ifstream
收到日志消息。如果没有,那么可能有另一个进程干扰了您的文件。
注意:操作系统需要一些时间才能使文件更改对其他进程可见。在高负载下,我观察到几百毫秒的延迟,例如,直到消息显示在tail -f
。