recvmsg返回错误(EBADF)时,两个进程之间使用套接字对通信



我正在开发一个程序,它在两个进程之间进行IPC调用。我使用socketpair:

创建了两个套接字fd
int 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的某些内容,否则一个进程中的句柄在另一个进程中无效。为什么不能继续使用原来的插座?

最新更新