daemon守护进程中将stdin,stdout,stderr重定向到/dev/null的问题
来源:互联网 发布:淘宝修改发货地址 编辑:程序博客网 时间:2024/06/05 06:26
有人认为对于后台守护进程做此类重定向操作浪费资源,建议直接关闭0、1、2号句
柄拉倒,这是非常不正确的。假设它们确实被关闭了,则一些普通数据文件句柄将等
于0、1、2。以2号句柄为例,某些库函数失败后会向2号句柄输出错误信息,这将破
坏原有数据。
1、如下代码将stdin、stdout、stderr重定向到/dev/null
freopen( "/dev/null", "w", stdout ); freopen( "/dev/null", "w", stderr ); freopen( "/dev/null", "r", stdin );
第一种方式不是总能达到目的。freopen()并不确保新的文件流描述符一定重用底层
原有文件句柄。假如未能重用,向stderr流输出的标准I/O函数最终输出到/dev/null,
但那些向STDERR_FILENO句柄输出的标准I/O函数就没这么幸运了,可能输出到一些不
可预期的文件中去。换句话说,2号句柄此时不再是标准错误输出了。比如:
write( 2, … ),这样的调用存在安全问题。
2、apue中daemon例子中是如下做的:
close( 0 ); close( 1 ); close( 2 ); open( "/dev/null", O_RDWR ); dup( 0 ); dup( 0 );
这种方式可以避免上述问题,然而存在竞争环境问题。
3、现在看下述代码:
int fd = open( "/dev/null", O_RDWR ); /* * handle failure of open() somehow */ dup2( fd, 0 ); dup2( fd, 1 ); dup2( fd, 2 ); if ( fd > 2 ) { close( fd ); }
与第二种方式相比,这种代码是线程安全的。
0 0
- daemon守护进程中将stdin,stdout,stderr重定向到/dev/null的问题
- 如何将stdin、stdout、stderr重定向到/dev/null
- Linux守护进程的stdout, stdin, stderr
- 验证daemon程序中setsid的作用以及重定向stdin、stdout、stderr的原因
- scripts: stdin, stdout和stderr的重定向的解释
- stdin,stdout,stderr和重定向
- 转载:stdin, stdout, stderr以及重定向
- stdin, stdout, stderr以及重定向
- 2.stdin, stdout, stderr以及重定向
- python 打印重定向:stdin,stdout,stderr
- Bash 中将 stderr 和 stdout 重定向到一个file
- stdin,stdout,stderr,生定向到文件
- stdin, stdout, stderr 从定向
- Windows管道(Pipe)重定向stdout,stderr,stdin
- Windows管道(Pipe)重定向stdout,stderr,stdin
- Windows管道(Pipe)重定向stdout,stderr,stdin
- Linux重定向输出,输入,错误 stdin stdout stderr
- Linux重定向命令(stdout, stdin, stderr)
- ANDROID 命名规范
- 理解面向对象
- AngularJs 自定义filter
- Spring javaBean关于属性命名的特殊规范
- HDFS 上的数据导入到Hbase
- daemon守护进程中将stdin,stdout,stderr重定向到/dev/null的问题
- SimpleArrayMap源码解析
- ext2 、ext3 、ext4
- Linux总结(七):文本搜索(grep)和文件搜索(locate,find,which,whereis)
- dubbo项目启动报无法读取方案文档 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd', 原因为 1) 无法找到文档; 2) 无法读取文档;
- Android 中读写excel 中的类容
- 最近收集的一些面试题
- AngularJs指令之scope属性详解---看完这篇,都不好意思说自己没学会!
- 基本数学概念——数列