【发布时间】:2013-06-15 23:41:21
【问题描述】:
在我维护的软件基线中,有 150 条语句分布在各种 C 应用程序中,它们调用另一个 Linux 命令(例如 rm -rf ...)或使用 status = system(cmd)/256 的自定义应用程序。当任一被调用时,从 Linux 命令或自定义应用程序返回的状态代码除以 256。这样当状态码大于0时,我们就知道有问题了。但是,软件的编写方式并不总是记录哪个命令或应用程序返回了状态代码。因此,如果状态码是 32768,除以 256 时,报告的状态码是 128。
软件很旧,虽然我可以进行更改,但如果调用的任何命令或调用的应用程序在其他地方报告其原始状态代码,那就太好了。
有没有办法确定标准 Linux 日志文件中的原始状态码以及返回该状态码的应用程序?
【问题讨论】:
-
编写一个包装器(函数或宏),它调用原始的
system()并在返回之前记录完整的结果。 -
system返回的状态码适合一个字节,除非命令收到信号(例如,与SIGSEGV一起崩溃) -
@BasileStarynkevitch:那为什么要除以 256?我看到诸如 32768 之类的错误代码。
-
仔细阅读 waitpid(2) 手册页并在系统的
/usr/include/bits/waitstatus.h和/usr/include/stdlib.h中查找定义WTERMSIG等的宏。实际上,您的程序应该使用这样的宏WIFEXITED,WEXITSTATUS,WIFSIGNALED,WTERMSIG, 等等......关于system(3)库函数的结果。
标签: c linux error-code