小编And*_*sev的帖子

fclose在android和linux上的工作方式不同

以下计划:

#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模拟器.找不到有关此问题的任何信息 - 我可以在两个平台上使此代码的工作类似吗?freopenstderr有同样的问题.

更新:

以前的小程序演示了我遇到的实际问题的原因:如果我尝试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)

linux android fclose android-ndk freopen

5
推荐指数
2
解决办法
1043
查看次数

使用带有perlcritic的IPC :: Open3

我想在子进程中压缩输出并只读取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)

perl perl-critic ipcopen3

5
推荐指数
1
解决办法
584
查看次数

标签 统计

android ×1

android-ndk ×1

fclose ×1

freopen ×1

ipcopen3 ×1

linux ×1

perl ×1

perl-critic ×1