0

我正在开发一个在两个进程之间进行 IPC 调用的程序。我使用socketpair创建了两个套接字 fd :

int fds[2] = {-1,-1};
if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fds)) {
    return NULL;
}

在进程 A(具有系统权限)中,我通过发送(使用 fd[0])函数发送一个整数(句柄):

int sock_send_all(int sock_fd, const uint8_t* buf, int len) {  
    int s = len;
    int ret = send(sock_fd, buf, s, 0);
    ...
}  

在进程 B(具有用户权限)中,它等待通过recvmsg接收句柄(使用 fd[1]):

ret = recvmsg(fd, &msg, MSG_NOSIGNAL);  

问题出现在这里:recvmsg 立即返回 -1,errorno等于 9(EBADF)!

我已经上网很长时间试图找到答案,但没有任何有用的信息。你有什么提示或建议吗?谢谢!

这是关于进程权限级别的问题吗?或者我应该使用setsockopt来设置一些东西?

4

2 回答 2

1

我已经解决了我的问题。
关键是将原始文件描述符封装到ParcelFileDescriptor对象中,并将该对象传递给另一个进程,而不是直接在两个进程之间传递文件描述符。
我认为ParcelFileDescriptor在 android 中的实现对原始文件描述符做了一些配置。也许我应该阅读实现代码以找到真正的原因。谢谢你们!

于 2013-05-22T11:58:15.853 回答
0

除非我不知道有关 IBinder 的某些内容,否则一个进程中的句柄在另一个进程中无效。为什么不能继续使用原来的插座?

于 2013-05-21T02:51:25.107 回答