使用socketpair在两个进程之间进行通信时,recvmsg返回错误(EBADF)?

时间:2013-05-21 01:36:07

标签: android linux sockets ipc

我正在开发一个在两个进程之间进行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 来设置一些东西?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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