【发布时间】:2013-05-15 16:15:34
【问题描述】:
我正在开发一个在两个进程之间进行 IPC 调用的程序。我使用 socketpair 创建了两个套接字 fd:
int fds[2] = {-1,-1};
if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fds)) {
return NULL;
}
在进程A中(具有system权限),我通过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 来设置一些东西?
【问题讨论】:
-
进程B是如何获得
fd[1]?的 -
@EJP:我实际上是在 Android 平台上开发我的程序。进程B是IBinder(Android IPC机制)的客户端进程。简单来说,fd[1]是通过另一个unix-socket接收的(我认为Android是使用unix-socket在内核中实现IBinder驱动的)
-
我确认调用 send 和 recvmsg 之前的 fd[0] 和 fd[1] 的值与从socketpair.
-
请显示用于发送和接收文件描述符的代码。此外,出于特权考虑,您可以在非特权情况下测试代码。你确定你所谓的“系统权限”应用程序真的有吗?仅仅在 Manifest 中声明它不会如此。