2009-06-07 123 views
0

我已经编写了用于在使用流的无关进程之间传递文件描述符的代码。 服务器应等待客户端发送文件描述符。 这里是服务器代码:为什么ioctl()不阻塞?

#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

您使用的是什么操作系统?在不知道操作系统的情况下很难回答有关操作系统调用的问题。 – Dipstick 2009-06-07 20:33:47

+0

你为什么认为它返回一个错误?该代码甚至不检查ioctl返回值。如果它不是-1,则errno不会更改,并且可能具有先前系统调用的值(例如,在动态加载器或启动例程中)。 – mark4o 2009-06-07 21:42:17

回答

2

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

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

0

这是实际的代码吗? 您无法创建或接收有效的filedescriptor。

2

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


从哪里开始?

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

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

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


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

+0

从技术上讲,可以省略main()的返回类型(但对于main _only_),在这种情况下,假定为'int'。同样,可以省略main(也是main _only_)中的return语句,在这种情况下存在隐式的“返回0”。尽管如此,这仍然是不好的做法。 – 2009-06-07 20:00:29

0

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

pipe(pipefd); 

线前close打电话...?

相关问题