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