我有一个奇怪的问题,我想我有一个解决办法,但我正在尝试做一个根本原因分析。
我一直在开发一个在嵌入式版本的Ubuntu10.04LTS上运行的应用程序。当应用程序启动时,它从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
}我认为这只是一个权限问题,但我不明白为什么当我自动启动软件时它不工作,而不是在终端中手动运行它。此外,我不能理解为什么配置文件可以正确读取,但这个文件却无法打开。
我能看到的唯一区别是,配置文件读取是使用fstream完成的,而记录器使用的是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可以工作而不能fopen?我是不是从根本上遗漏了什么?
提前谢谢。
发布于 2011-09-02 21:22:48
您的问题没有提供足够的信息来回答,但解决此类问题的一般方法应该是在strace下运行程序(两种形式),并比较所执行的syscall的顺序。这应该会很快揭示出发生了什么不同的事情。我怀疑你会发现filename的内容是无效的。
https://stackoverflow.com/questions/7283564
复制相似问题