我正在开发一个在两个进程之间进行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 来设置一些东西?
答案 0 :(得分:0)
除非我不知道IBinder的某些内容,否则一个进程中的句柄在另一个进程中无效。为什么你不能继续使用原来的插座?
答案 1 :(得分:0)
我已经解决了我的问题
关键点是将原始文件描述符封装到 ParcelFileDescriptor 对象中,并将对象传输到另一个进程,而不是直接在两个进程之间传输文件描述符。
我认为android中 ParcelFileDescriptor 的实现做了一些关于原始文件描述符的配置。也许我应该阅读实现代码以找到真正的原因。
谢谢大家!