Unix C – 便携式WEXITSTATUS
发布时间:2020-12-15 22:08:04 所属栏目:安全 来源:网络整理
导读:我正在尝试获取子进程的退出代码.在 Linux和FreeBSD上,我可以这样: [0] [ishpeck@kiyoshi /tmp]$unameFreeBSD[0] [ishpeck@kiyoshi /tmp]$cat tinker.c #include stdio.h#include sys/wait.hint main(void){ FILE *proc = popen("ls","r"); printf("Exit co
我正在尝试获取子进程的退出代码.在
Linux和FreeBSD上,我可以这样:
[0] [ishpeck@kiyoshi /tmp]$uname FreeBSD [0] [ishpeck@kiyoshi /tmp]$cat tinker.c #include <stdio.h> #include <sys/wait.h> int main(void) { FILE *proc = popen("ls","r"); printf("Exit code: %dn",WEXITSTATUS(pclose(proc))); return 0; } [0] [ishpeck@kiyoshi /tmp]$gcc tinker.c -o tinker [0] [ishpeck@kiyoshi /tmp]$./tinker Exit code: 0 [0] [ishpeck@kiyoshi /tmp]$grep WEXITSTATUS /usr/include/sys/wait.h #define WEXITSTATUS(x) (_W_INT(x) >> 8) 但是,在OpenBSD上,我收到编译器的投诉…… [0] [ishpeck@ishberk-00 /tmp]$uname OpenBSD [0] [ishpeck@ishberk-00 /tmp]$cat tinker.c #include <stdio.h> #include <sys/wait.h> int main(void) { FILE *proc = popen("ls",WEXITSTATUS(pclose(proc))); return 0; } [0] [ishpeck@ishberk-00 /tmp]$gcc tinker.c -o tinker tinker.c: In function 'main': tinker.c:7: error: lvalue required as unary '&' operand [1] [ishpeck@ishberk-00 /tmp]$grep WEXITSTATUS /usr/include/sys/wait.h #define WEXITSTATUS(x) (int)(((unsigned)_W_INT(x) >> 8) & 0xff) 我真的不在乎它是如何完成的,我只需要退出代码. 这让我相信我在Mac上也会遇到这个问题: 是否有更便携的方式来使用WEXITSTATUS宏?还是有更便携的替代方案? 解决方法
OpenBSD的WEXITSTATUS实现在其参数上使用了address-of运算符(一元&),实际上要求其参数具有存储空间.您正在使用函数的返回值调用它,该函数没有存储空间,因此编译器会抱怨.
目前还不清楚OpenBSD的WEXITSTATUS是否符合POSIX标准,但通过将pclose()的返回值赋给变量可以轻松解决问题: int status = pclose(proc); printf("Exit code: %dn",WEXITSTATUS(status)); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- .NET 查询天气预报的Webservice接口程序源代码
- 如何在Docker Swarm中设置Hadoop?
- twitter-bootstrap-3 – Bootstrap“grunt watch”不会创建
- BootStrap入门教程 (二)
- WebService之XFire+Spring集成(使用注解)
- AngularJS的Provider, Value, Constant, Service, Factory,
- scala – sbt 0.11.3:获取最新版本的git插件
- 如何从bash shell脚本中的一行中提取一个单词[复制]
- scala – 当组合继承的特征时,“覆盖”如何工作?
- Docker构建过程中的AWS凭据