当前位置:  技术问答>linux和unix

perror会修改errno?

    来源: 互联网  发布时间:2016-06-24

    本文导语:  这个程序的运行结果很意外: #include  int main(){     perror("first");     perror("next");     return 0; } 结果是: 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 下运行正常,都报成功……

|
#include 
  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说的很清楚
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 里面打印一条错误信息而已,不会再有别的动作。

|
我运行的结果和lz是一样的。我估计有些发行版的库可能是做了更新的吧。

|
这个,perror肯定不会修改的
next: Illegal seek 
这个应该是调用基础库如libc时发生了问题,说明你当前的库版本有问题。
更新一下吧。

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • perror()是否线程安全?
  • 如何让perror()函数打印中文错误信息?
  • perror和strerror怎么获取的错误不一致.
  • pthread_join返回非0,但 perror 提示success
  • udp socket recvfrom偶尔会返回-1,perror打印出的提示是"recvfrom: Resource temporarily unavailable"
  • udp socket通讯,recvfrom()一直返回-1,perror提示"recvfrom: Bad address"


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3