0

我已经编写了使用流在不相关进程之间传递文件描述符的代码。服务器应该等待客户端发送文件描述符。这是服务器代码:

#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 - 错误的文件描述符。

4

4 回答 4

2

注意:自编写此答案以来,该问题已被广泛修改。


从哪里开始?

  • main()返回一个int.
  • pipefd未初始化。
  • 您关闭一个随机文件描述符。
  • 您调用recvfd()另一个随机文件描述符。
  • 您不会从main().
  • 您不使用该#define值。
  • 您没有显示#include编译所需的文件。
  • 未使用的变量fd
  • 未使用的变量statbuf
  • 未经检查的返回值i

基本问题 - 使用未初始化的变量。

辅助问题 - 有限的错误检查。


附加问题:从概念上讲,您需要一个可以传递文件描述符的服务器。您需要该服务器从其他(不相关)进程可以创建的文件描述符中读取。您需要仔细查看手册,但可能需要服务器侦听 Unix 域套接字,或者可能读取(命名的)FIFO。然后其他程序可以打开套接字或 FIFO 并将它们自己的文件描述符发送到服务器。

于 2009-06-07T19:58:20.167 回答
2

你没有提到你正在运行什么操作系统。I_RECVFD 是 STREAMS 扩展的一部分,通常仅存在于基于 System V 的 Unixy 操作系统(例如 AIX 和 Solaris)中。其他的,比如 Linux 和 BSD,不支持它并且可能永远不会支持它,因为 Posix 现在有使用 sendmsg() 和 recvmsg() 的替代方法。

恐怕我不知道为什么Linux如果不支持它有#defines I_RECVFD。

于 2009-06-07T20:32:15.950 回答
0

这是实际的代码吗?导致您无法在任何地方创建或接收有效的文件描述符。

于 2009-06-07T19:58:14.800 回答
0

你永远不会初始化pipefd!缺少一个

pipe(pipefd);

通话前的线路close...?

于 2009-06-07T19:58:50.557 回答