stdout( 标准输出流)和 stderr( 标准输入流) 重定向问题

  我想把提示信息和错误信息列表都写入到同一个文件里,

1 /*
2 ** 设置流, 使输出与错误流都指向指定的文件
3 */
4 if( (output1 = freopen( PATH, "a", stdout ) ) == NULL )
5     exit( EXIT_FAILURE );
6
7 if( (output2 = freopen( PATH, "a", stderr ) ) == NULL )
8     exit( EXIT_FAILURE );

   开始, 我这么写

fputs( "错误列表:\n", output1 );
for( i = 1; i <= 42; i ++ ){
       errno = i;
       perror( "ERROR" );
}

结果, 文件中的内容是 错误信息列表在前面, 提示信息在结尾处。

我百度了下, 发现stdout流的缓冲方式是完全缓冲,stderr是不缓冲, 完全缓冲是指等缓冲区满了后写入, 所以我用setvbuf改变了stdout的缓冲方式( 还要声明一个足够大的数组buffer), 改成不缓冲, 即在这段代码前添加一句

setvbuf( output1, buffer, _IONBF, BUFSIZ );

这样,问题就解决了。

还有一种办法, 就是在fputs后加一句   fflush( output1 );  意思是立即写入缓冲区的内容。

最后, 贴出结果, 嘻嘻

时间: 2024-12-24 17:43:06

stdout( 标准输出流)和 stderr( 标准输入流) 重定向问题的相关文章

WorkerMan源码分析(resetStd方法,PHP中STDIN, STDOUT, STDERR的重定向)

WorkerMan中work.php中 resetStd 方法中代码如下 public static function resetStd() { if (!static::$daemonize || static::$_OS !== 'linux') { return; } global $STDOUT, $STDERR; $handle = fopen(static::$stdoutFile, "a"); if ($handle) { unset($handle); //关闭标准输出

python重定向sys.stdin、sys.stdout和sys.stderr

标准输入.标准输出和错误输出. 标准输入:一般是键盘.stdin对象为解释器提供输入字符流,一般使用raw_input()和input()函数. 例如:让用户输入信息(Python环境为2.x): 1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 import sys 4 name = raw_input("Please input your name: ") 5 print name 6 7 # python test.py 8 Plea

【转】stdin, stdout, stderr 以及重定向

详细见: http://my.oschina.net/qihh/blog/55308 stdin是标准输入文件,stdout是标准输出文件,stderr标准出错文件. 程序按如下方式使用这些文件: 标准输入是程序可以读取其输入的位置.缺省情况下,进程从键盘读取 stdin . 标准输出是程序写入其输出的位置.缺省情况下,进程将 stdout 写到终端屏幕上. 标准错误是程序写入其错误消息的位置.缺省情况下,进程将 stderr 写到终端屏幕上.

find,vim的编程设置,SUID,SGID,SBIT,软.硬链接,重定向

1.find命令: 基本格式:find 路径 选项 参数 -name  : 根据文件名字查找 -size  :根据文件大小查找    +(比这个大)  -(比这个小) -type  :根据文件类型查找    - 普通文件 -d 目录 -l 链接文件 -c 字符设备文件 -b 块设备文件 -p 管道文件 -uid   : 根据用户的UID查找 -gid   :根据用户所属组查询 -nouser :查询没有所属用户的 -nogroup:查询没有所属组的 -perm  :根据权限查找 最后可以-exe

Python编写守护进程程序

Python编写守护进程程序思路 1. fork子进程,父进程退出通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端和shell都是进程,shell进程是终端进程的子进程,通过ps命令可以很容易的查看到.在这个shell环境下一开始执行的程序都是shell进程的子进程,自然会受到shell进程的影响.在程序里fork子进程后,父进程退出,对了shell进程来说,这个父进程就算执行完了,而产生的子进程会被init进程接管,从而也就脱离了终端的控制. 2-4

纯干货 | Node.js快速入门指南与实践

前言 Node.js知识点虽然不多,但是想要通篇的看完并快速上手还是需要一些时间的.而这篇文章主要总结工作中Node.js一些常用模块API的用法以及优秀的第三方模块,帮助你快速的上手.Good Luck?????? 惯例 Node.js是基于Chrome V8引擎的Javascript运行环境. console - 控制台 1.控制台打印信息 console.log('日志信息'); console.warn('警告信息'); console.debug('调试信息'); console.er

shell 脚本中后台执行命令 &amp;

最近遇到一个问题, 执行脚本,脚本调用 一个命令,命令(deamon)是一个守护进程,为了调试,取消了守护进程模式.导致命令后边的其他命令(echo "456")都无法执行. deamon -d 是以守护进程模式启动:deamon -x 是以非守护进程模式启动(监控进程,死循环),stdout和stderr 关联到 控制终端. 脚本是 a.sh #!/bin/sh echo “123“ /usr/local/bin/deamon -d & >/dev/null 2>

python print &#183; sys.stdout &#183; sys.stderr

参考文档 Python重定向标准输入.标准输出和标准错误 http://blog.csdn.net/lanbing510/article/details/8487997 python重定向sys.stdin.sys.stdout和sys.stderr http://www.cnblogs.com/guyuyuan/p/6885448.html 1.print print obj 事实上是调用了sys.stdout.write(obj+'\n'),注意多了一个换行符 1a. print在pytho

stdin、stdout、stderr

1 stdin键盘 2 stdout显示器 3 stderr错误 1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include<stdio.h> 4 #include<stdlib.h> 5 6 main() 7 { 8 //stderr始终在显示器,如果重定向,stdout会被写入磁盘 9 //遇到错误,就可以把错误信息写入stderr,会自动在显示器上输出 10 11 fprintf(stderr, "stderr你遇到的错误是%s,重