我遇到了一个奇怪的问题,我认为我可以解决该问题,但是我正在尝试进行根本原因分析。
我一直在开发在嵌入式版本的Ubuntu 10.04 LTS上运行的应用程序。当应用程序启动时,它将从SD卡中读取配置文件,初始化一些类,启动一个记录器,该记录器将写入SD卡,然后继续进行操作。在开发过程中,当我通过SSH终端手动启动时,它运行良好。
我最近一直在尝试在操作系统启动时自动启动应用程序。我在init.d中有一个脚本可以做到这一点。但是,我注意到现在没有日志文件正在生成。我发现这不是SD卡不可用的问题,因为启动时可以正确读取配置文件,但是当我尝试打开日志文件以使用fopen进行写入时会引发错误。
// Open the file
mLogFile = fopen(filename, "wb");
if(mLogFile == NULL)
{
printf("Error opening Log File [%d].\n", lnRetval);
return -1; //File couldn't be opened
}
我以为这只是一个权限问题,但是当我自动启动该软件而不是在终端中手动运行该软件时,我无法理解为什么它不起作用。此外,我无法理解为什么正确读取配置文件,但是无法打开该文件。
我可以看到的唯一区别是,配置文件的读取是使用fstreams完成的,而记录器使用的是C文件I / O。因此,我通过将以下代码直接放在上面的fopen调用之前进行了实验(/ home / root / etc是SD卡的安装位置)。
std::ofstream out("/home/root/etc/log/testlog.log");
out << "I can write using fstreams.\n";
out.close();
通过init.d启动时,该方法有效并生成了文件。现在我完全陷入了困境。为什么ofstream可以正常工作而不能正常运行?从根本上说我缺少什么?
提前致谢。
最佳答案
您的问题没有提供足够的信息来回答,但是解决此类问题的一般方法应该是在strace
下运行程序(以两种形式)并比较系统调用的顺序。那应该很快揭示出正在发生的变化。我怀疑您会发现filename
的内容无效...
关于c++ - Fopen vs ofstream,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7283564/