当前位置: 技术问答>linux和unix
perror会修改errno?
来源: 互联网 发布时间:2016-06-24
本文导语: 这个程序的运行结果很意外: #include int main(){ perror("first"); perror("next"); return 0; } 结果是: first: Success next: Illegal seek 不知道怎么回事,man手册上也没说perror会修改errno | ...
这个程序的运行结果很意外:
结果是:
first: Success
next: Illegal seek
不知道怎么回事,man手册上也没说perror会修改errno
#include
int main(){
perror("first");
perror("next");
return 0;
}
结果是:
first: Success
next: Illegal seek
不知道怎么回事,man手册上也没说perror会修改errno
|
应该不会修改,你没有执行一个会改变error的函数,貌似他就是会乱跳。这个具体的回答要等高人了。
然后,不会有你这样的应用的。纯粹测试而已。
然后,不会有你这样的应用的。纯粹测试而已。
|
……
VS 2010 下运行正常,都报成功……
VS 2010 下运行正常,都报成功……
|
#include
void perror( const char *str );
perror()函数打印str(字符串)和一个相应的执行定义的错误消息到全局变量errno中
void perror( const char *str );
perror()函数打印str(字符串)和一个相应的执行定义的错误消息到全局变量errno中
|
不可能吧??????
|
正常啊,我也试过,是有这种情况。不过又没影响的。
|
我在ubuntu9.04中试没发现你这个问题啊。
|
两次输出的都是“Success”。
|
你怎么看得man啊?
man 3 perror
里面的描述如下:
When a system call fails, it usually returns -1 and sets the variable errno to a value describing what went wrong.
(These values can be found in .) Many library functions do likewise. The function perror() serves to
translate this error code into human-readable form. Note that errno is undefined after a successful library call:
this call may well change this variable, even though it succeeds, for example because it internally used some other
library function that failed. Thus, if a failing call is not immediately followed by a call to perror, the value of
errno should be saved.
man 3 perror
里面的描述如下:
When a system call fails, it usually returns -1 and sets the variable errno to a value describing what went wrong.
(These values can be found in .) Many library functions do likewise. The function perror() serves to
translate this error code into human-readable form. Note that errno is undefined after a successful library call:
this call may well change this variable, even though it succeeds, for example because it internally used some other
library function that failed. Thus, if a failing call is not immediately followed by a call to perror, the value of
errno should be saved.
|
确实,man说的很清楚
Note that errno is undefined after a successful library call: this call may well change this variable, even though it succeeds, for example because it internally used some other library function that failed.
第一:在成功返回的前提下,errno是未定义的。
第二:原因可能是前一个调用代码的执行可能会有某个其他的库函数失败。
我的系统是Debian 5.0。我用lz的代码编了一个a.out,执行如下命令
$ strace ./a.out
有如下输出:
大家看看,是不是有属于man中所说的情况。我觉得是的。
Note that errno is undefined after a successful library call: this call may well change this variable, even though it succeeds, for example because it internally used some other library function that failed.
第一:在成功返回的前提下,errno是未定义的。
第二:原因可能是前一个调用代码的执行可能会有某个其他的库函数失败。
我的系统是Debian 5.0。我用lz的代码编了一个a.out,执行如下命令
$ strace ./a.out
有如下输出:
execve("./a.out", ["./a.out"], [/* 40 vars */]) = 0
brk(0) = 0x8769000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fae000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=74119, ...}) = 0
mmap2(NULL, 74119, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f9b000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/i686/cmov/libc.so.6", O_RDONLY) = 3
read(3, "177ELF111331260e10044"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1413540, ...}) = 0
mmap2(NULL, 1418864, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e40000
mmap2(0xb7f95000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x155) = 0xb7f95000
mmap2(0xb7f98000, 9840, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7f98000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7e3f000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7e3f6b0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0xb7f95000, 4096, PROT_READ) = 0
munmap(0xb7f9b000, 74119) = 0
dup(2) = 3
fcntl64(3, F_GETFL) = 0x2 (flags O_RDWR)
brk(0) = 0x8769000
brk(0x878a000) = 0x878a000
fstat64(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fad000
_llseek(3, 0, 0xbfdcb03c, SEEK_CUR) = -1 ESPIPE (Illegal seek)
write(3, "first: Successn"..., 15first: Success
) = 15
close(3) = 0
munmap(0xb7fad000, 4096) = 0
dup(2) = 3
fcntl64(3, F_GETFL) = 0x2 (flags O_RDWR)
fstat64(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fad000
_llseek(3, 0, 0xbfdcb03c, SEEK_CUR) = -1 ESPIPE (Illegal seek)
write(3, "next: Illegal seekn"..., 19next: Illegal seek
) = 19
close(3) = 0
munmap(0xb7fad000, 4096) = 0
exit_group(0) = ?
大家看看,是不是有属于man中所说的情况。我觉得是的。
|
这个是运行时标准库函数,应该是不依赖系统的,尚不知道你的问题。
它的作用不过是往 stderr 里面打印一条错误信息而已,不会再有别的动作。
它的作用不过是往 stderr 里面打印一条错误信息而已,不会再有别的动作。
|
我运行的结果和lz是一样的。我估计有些发行版的库可能是做了更新的吧。
|
这个,perror肯定不会修改的
next: Illegal seek
这个应该是调用基础库如libc时发生了问题,说明你当前的库版本有问题。
更新一下吧。
next: Illegal seek
这个应该是调用基础库如libc时发生了问题,说明你当前的库版本有问题。
更新一下吧。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。