Следующая программа:
#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
на stderr
имеет ту же проблему.
Обновление:
Предыдущая небольшая программа демонстрирует причину реальной проблемы, с которой я столкнулся: если я попытаюсь freopen
stderr
в файл в несуществующем каталоге, в Linux stderr
закрыт, но на Android он остается открытым! И даже больше - если я напишу что-то в этом открытом stderr
файле, а затем сделаю 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