| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5642 人关注过本帖
标题:strerror(errno)和stderr问题
只看楼主 加入收藏
kelas
Rank: 6Rank: 6
等 级:侠之大者
帖 子:176
专家分:434
注 册:2010-5-28
结帖率:94.12%
收藏
已结贴  问题点数:10 回复次数:4 
strerror(errno)和stderr问题
fprintf(stderr,"Open %s Error:%s/n",argv[1],strerror(errno));
其中strerror(errno)怎么解释和stdin、stdout、stderr 怎么用法
搜索更多相关主题的帖子: errno stderr strerror 
2010-07-23 14:05
hanzhenddd
Rank: 5Rank: 5
等 级:职业侠客
帖 子:90
专家分:361
注 册:2010-3-4
收藏
得分:1 
strerror 是把出错信息打印到指定位置 stderr 即:打印到标准出错。。 也可以选择打印到其他位置!

stdin   stdout 为标准输入输出。。

perror 输出固定为stdout


2010-07-23 14:25
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:4 
strerror :strerror是把一个错误numb作为参数,然后返回错误numb所对应的错误语段,一般用errno。   perror是在标准输出上输出msg字符串,然后再后面加上:错误语段(这个错误语段对应这时的errno)。
附测试代码:
#include <stdio.h>
2 #include <string.h>
3 #include <errno.h>
4   
5 int  6 main(int argc, char *argv[])   
7 {   8 fprintf(stderr, "EACCES:%s\n", strerror(EACCES));   
9 errno = ENOENT;
10 printf("ENOENT:%s\n",strerror(errno));
11 perror(argv[0]);   
12 exit(0);  
13 }

stdin stdout:程序在启动时都会打开三个流,一个用于输入,一个用于输出,一个用于打印诊断或错误消息。典型的,他们被连接到用户的终端      (参见 tty(4))      但是也有可能指向文件或是其他设备,取决于父进程选择设置了什么 (参见 sh(1)      的重定向 (``Redirection'') 章节。)       输入流被称为 ``standard input''; 输出流被称为 ``standard output'';      错误流被称为 ``standard      error''。这些名词通常简写为符号,用于引用这些文件,它们是 stdin, stdout,      和 stderr.       这些符号中,每一个都是 stdio(3) 中的一个宏,类型是指向 FILE      的指针,可以用于类似 fprintf(3) 或 fread(3) 等函数中。       由于 FILE 是一个对 Unix 文件描述符加以缓冲的包装,下层的文件也可以使用-      始的 Unix 文件接口来存取。也就是,类似 read(2) 和 lseek(2) 的函数。与流      stdin, stdout, 和 stderr 关联的整数形式的文件描述符分别是 0,1 还有      2。预处理器符号 STDIN_FILENO,STDOUT_FILENO 和 STDERR_FILENO      分别以它们为值,定义在 <unistd.h> 中。       注意混合使用 FILE 和-      始的文件描述符可能带来不可预料的结果,一般应当避免。(对于喜欢追根问底的人:POSIX.1      规范的 8.2.3 节详细地描述了这样的混合使用怎样才能不出错。)      一个简单的规则是,文件描述符由内核控制,而 stdio      仅仅是一个库。它的意思是,例如当调用 exec      之后,子进程可以继承所有打开的文件描述符,但是任何杂械牧鞫疾豢稍俅嫒×恕       由于符号 stdin, stdout, 和 stderr      被指定为宏,为它们赋值将导致不可移植。利用库函数 freopen(3)      ,标准流可以用来指向不同的文件。引进这个函数专门用来为 stdin, stdout, 和      stderr 重新赋值。标准流在调用 exit(3) 和程序正常中止时被关闭。      sh(1), csh(1), open(2), fopen(3), stdio(3)

perror: 输出固定为stdout


欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-23 20:09
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
perror 默认是输出到标准错误吧~~ 更正一下楼上的。
2010-07-24 01:11
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:5 
楼上对那两个函数说的很詳細了。我讲点相关的东西,以便加深理解。

首先楼主得知道 fprintf 怎么用。它的第一个参数是 FILE* ,stdin stdout stderr 都是定义好了的。可以直接用。


然后就是问到的那两个错误处理函数。

perror 就是把错误号关联原因输出到 stderr。直接输出很方便,一般程序里用的比较多。
比如 perror ("fopen"); 这个语句,会输出类似:
fopen: XXXXXX
的样子。XXX 表示错误的原因。
很多库函数有返回值。在出现错误后,会返回一个特殊值,以指示错误。并祈求调用都检查。但发现错误后,通过返回值可能不能确定错误原因。因此那些库函数会再返回之前,设置 erron 这个全局变量。调用者在接到返值之后,如果发现错误发生,应该立刻核查 erron 的值,并做错误处理。
不过有些错误是致命错误,没什么可处理的办法,那么好的原则,是打印错误信息并退出程序。这时 perror 就会派上用场,它直接利用 erron 变量的值,因此好像不用传什么参数。但是究竟是在什么地方出的错误呢?如果只打一个错误会让人费解,那么前缀一些提示信息会更好一些。
比如我举的那个例子,就像是在说,执行 fopen 的时候发生了错误,错误原因是 XXXX。

为什么不直接用 erron 来表示错误呢?因为它是一个数。我说发生了错误5,谁知道是什么意思?还有,随着环境不同,同一个数也可能表示的意思不同。perror 会把它翻译成一个可读的字符串打出来。

你会发现,perror 的行为太固定,不灵活(其实一般也够用了~~)。 strerror 可能会派上点用场。它只把数翻译成串返回来,不打印。你把它放到 fprintf 里,像这样,你就可以更自由的输出些东西。另一个灵活的地方是,它是根据传的参数转换的,不是固定用的 erron。
比如你想知道你的系统把 5 定义成什么错误啦之类的问题,用 strerror 可以娱乐一下~~
2010-07-24 01:33
快速回复:strerror(errno)和stderr问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028318 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved