2011-09-02 56 views
1

我有一个奇怪的问题,我想我有一个解决方法,但我试图做一个根本原因分析。fopen vs流

我一直在开发一个在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启动时工作和生成的文件。现在我完全难倒了。为什么流媒体工作而不是打开?有什么根本上我失踪了?

在此先感谢。

+1

你说没有生成日志文件,并尝试用fopen打开日志文件时出现错误。你确定用fopen打开一个有效的日志文件吗? ..对不起,如果我错过了什么。 – Wasi

+0

在您的流测试中,您为测试日志指定了硬编码路径。在fopen()调用中使用的'filename'是否也具有指定的完整路径?确保手动启动和init.d启动之间的相对路径不相同。 –

+0

这个问题应该阅读**为什么'fopen'在通过'std :: ofstream'使用时工作,但是直接使用**时不行。因为'std :: ofstream'里面只用了'fopen'。 –

回答

2

你的问题没有提供足够的信息来回答,但是像这样的问题的一般方法应该是在strace下运行该程序(两种形式)并比较系统调用的顺序。这应该很快揭示发生了什么不同。我怀疑你会发现filename的内容是无效的...