我正在开发一个程序,它在两个进程之间进行IPC调用。我使用socketpair:
创建了两个套接字fdint fds[2] = {-1,-1};
if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fds)) {
return NULL;
}
在进程A(具有系统权限)中,我通过send(使用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来设置一些东西?
我的问题已经解决了。
关键是将原始文件描述符封装到ParcelFileDescriptor object中,并将该对象传输到另一个进程,而不是直接在两个进程之间传输文件描述符。我认为实现ParcelFileDescriptor在android做一些配置关于原始文件描述符。也许我应该读一下实现代码来找出真正的原因。谢谢大家!
除非我不知道IBinder的某些内容,否则一个进程中的句柄在另一个进程中无效。为什么不能继续使用原来的插座?