我编写了使用流在不相关进程之间传递文件描述符的代码。 服务器应该等待客户端发送文件描述符。 这是服务器代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stropts.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int fd;
int pipefd[2];
pipe(pipefd);
close(pipefd[1]);
recvfd(pipefd[0]);
return 0;
}
void recvfd(int p)
{
struct strrecvfd rfdbuf;
struct stat statbuf;
int i;
i=ioctl(p, I_RECVFD, &rfdbuf);
printf("errno=%d\n",errno);
printf("recvfd=%d\n", rfdbuf.fd);
}
但我收到错误号码9 - 错误的文件描述符。
答案 0 :(得分:2)
注意:自从这个答案写完以来,这个问题已被广泛修改。
从哪里开始?
main()
会返回int
。pipefd
未初始化。recvfd()
。main()
返回值。#define
值。#include
个文件。fd
。statbuf
。i
。基本问题 - 使用未初始化的变量。
附属问题 - 有限的错误检查。
其他问题:从概念上讲,您需要一个可以传递文件描述符的服务器。您需要该服务器从其他(不相关)进程可以创建的文件描述符中读取。您需要仔细查看手册,但可能需要服务器侦听Unix域套接字,或者读取(命名)FIFO。然后,其他程序可以打开套接字或FIFO并将自己的文件描述符发送到服务器。
答案 1 :(得分:2)
您没有提到您正在运行的操作系统。 I_RECVFD是STREAMS扩展的一部分,它通常仅存在于基于System V的Unixy操作系统(例如AIX和Solaris)中。其他人,比如Linux和BSD,不支持它,可能永远不会,因为Posix现在有一个使用sendmsg()和recvmsg()的替代方案。
我担心我不知道为什么Linux有#defines I_RECVFD,如果它不支持它。
答案 2 :(得分:0)
这是实际的代码吗? 因为没有地方创建或接收有效的文件描述符。
答案 3 :(得分:0)
您永远不会初始化pipefd
!缺少一个
pipe(pipefd);
在close
来电之前行...?