加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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上也会遇到这个问题:
http://web.archiveorange.com/archive/v/8XiUWJBLMIKYSCRJnZK5#F4GgyRGRAgSCEG1

是否有更便携的方式来使用WEXITSTATUS宏?还是有更便携的替代方案?

解决方法

OpenBSD的WEXITSTATUS实现在其参数上使用了address-of运算符(一元&),实际上要求其参数具有存储空间.您正在使用函数的返回值调用它,该函数没有存储空间,因此编译器会抱怨.

目前还不清楚OpenBSD的WEXITSTATUS是否符合POSIX标准,但通过将pclose()的返回值赋给变量可以轻松解决问题:

int status = pclose(proc);
    printf("Exit code: %dn",WEXITSTATUS(status));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读