以下程序:
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
int main() {
fclose( stderr );
printf( "%d\n", fileno( stderr ) );
return 0;
}
-1
在 ubuntu 11.04 和2
ICS 4.0.3 模拟器上显示。找不到有关此问题的任何信息 - 我可以使此代码在两个平台上类似地工作吗?freopen
onstderr
有同样的问题。
更新:
以前的小程序演示了我遇到的实际问题的原因:如果我尝试freopen
stderr
在不存在的目录中归档,在 linux 上stderr
是关闭的,但在 android 上它保持打开状态!甚至更多 - 如果我在这个打开的stderr
文件中写入 smth 然后fopen
在其他文件上执行,我打印到stderr
的文本将写入这个打开的文件。
所以,这个程序:
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
# define LOGD( ... ) printf( __VA_ARGS__ ); printf( "\n" )
# ifdef ANDROID
# define HOMEDIR "/data/data/com.myapp/" // for android
# else
# define HOMEDIR "/home/darkmist/" // for linux
# endif
# define _T( x ) x
void TestFreopen_mkdir() {
int mkdirres = mkdir( HOMEDIR "1.d", 0777 );
LOGD(_T("TestFreopen mkdirres=0x%08x"),mkdirres);
}
void TestFreopen() {
LOGD(_T("TestFreopen begin"));
LOGD(_T("TestFreopen stderr=0x%08x"),fileno(stderr));
fprintf(stderr,"fprintf_1 to stderr\n");
// TestFreopen_mkdir(); // case 1
if ( NULL == freopen( HOMEDIR "1.d/1", "w", stderr ) ) {
LOGD( "freopen failed" );
if ( -1 != fileno( stderr ) ) {
fclose( stderr );
LOGD( "freopen closed" );
}
}
LOGD(_T("TestFreopen stderr=0x%08x"),fileno(stderr));
fprintf(stderr,"fprintf_2 to stderr\n");
TestFreopen_mkdir(); // case 2
FILE* fopen_file = fopen( HOMEDIR "1.d/2", _T( "wb" ) );
LOGD(_T("TestFreopen fopen_file=0x%08x"),fileno(fopen_file)); // same as for reopened stderr!!
fprintf(stderr,"fprintf_3 to stderr\n");
fprintf(fopen_file,"fprintf_1 to fopen_file\n");
fflush(fopen_file);
LOGD(_T("TestFreopen end"));
}
int main() {
TestFreopen();
return 0;
}
在 linux 上显示:
$ ./a.out
TestFreopen begin
TestFreopen stderr=0x00000002
fprintf_1 to stderr
freopen failed
TestFreopen stderr=0xffffffff
TestFreopen mkdirres=0x00000000
TestFreopen fopen_file=0x00000002
TestFreopen end
$ cat ~/1.d/2
fprintf_1 to fopen_file
这在android上:
$ adb push ./a.out /data/data/com.myapp
573 KB/s (34635 bytes in 0.058s)
$ adb shell run-as com.myapp /data/data/com.myapp/a.out
TestFreopen begin
TestFreopen stderr=0x00000002
fprintf_1 to stderr
freopen failed
freopen closed
TestFreopen stderr=0x00000002
TestFreopen mkdirres=0x00000000
TestFreopen fopen_file=0x00000002
TestFreopen end
$ adb shell run-as com.myapp cat /data/data/com.myapp/1.d/2
fprintf_3 to stderr
fprintf_1 to fopen_file