getsockname返回-1,errno是EBADF吗?

时间:2017-07-03 14:44:40

标签: android c sockets java-native-interface sockaddr-in

程序运行到getsockname,其中返回值为-1,errno为9(EBADF,错误的文件描述符)。但是,在Android应用程序中检测的代码运行良好。

void sysLibCSendHookHandler(CPUState* env, int isStart){

if(isStart){
    int fd = env->regs[0];
    int buf = env->regs[1];
    int len = env->regs[2];
    int flags = env->regs[3];
    DECAF_printf("xxxxx send(%d, %p, %d, %d)\n", fd, buf, len, flags);
    extern int errno;
    struct sockaddr_un sock_addr;
    socklen_t sock_addr_len;
    sock_addr_len = sizeof(sock_addr);
    int t = getsockname(fd, (struct sockaddr*)&sock_addr, &sock_addr_len);
     DECAF_printf("fd:%d",fd);}

1 个答案:

答案 0 :(得分:2)

此代码导致未定义的行为:

extern int errno;

the C Standard的每 7.5错误< errno.h> (请注意粗体部分):

  

标题定义了几个宏,都与之相关   报告错误情况。

     

宏是

EDOM
EILSEQ
ERANGE
     

扩展为类型为int的不同的整数常量表达式   正值,适用于#if预处理   指令;和

errno
     

扩展为具有int类型的可修改左值   线程本地存储持续时间,其值设置为a   多个库函数的正误差数。 如果是宏   为了访问实际对象,禁止定义,   或者程序定义名称为errno的标识符   行为未定义。

根据Google Android source codeerrno是定义为

的宏
extern int *__geterrno(void);

#define errno (*__geterrno())

在这种情况下,您在extern int errno中看到的价值毫无意义。