以下计划:
#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;
}
Run Code Online (Sandbox Code Playgroud)
显示-1在Ubuntu 11.04和2对ICS 4.0.3模拟器.找不到有关此问题的任何信息 - 我可以在两个平台上使此代码的工作类似吗?freopen上stderr有同样的问题.
更新:
以前的小程序演示了我遇到的实际问题的原因:如果我尝试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/" …Run Code Online (Sandbox Code Playgroud) 我想在子进程中压缩输出并只读取stderr.perlfaq8建议做以下事项:
# To capture a program's STDERR, but discard its STDOUT:
use IPC::Open3;
use File::Spec;
use Symbol qw(gensym);
open(NULL, ">", File::Spec->devnull);
my $pid = open3(gensym, ">&NULL", \*PH, "cmd");
while( <PH> ) { }
waitpid($pid, 0);
Run Code Online (Sandbox Code Playgroud)
但后来perlcritic争论使用裸字文件句柄.
我唯一可以设计的是将select新打开的描述符/dev/null改为on STDOUT,如下所示:
# To capture a program's STDERR, but discard its STDOUT:
use IPC::Open3;
use File::Spec;
use Symbol qw(gensym);
open my $null, ">", File::Spec->devnull;
my $old_stdout = select( $null );
my $pid = …Run Code Online (Sandbox Code Playgroud)