为什么ioctl()没有阻塞?

时间:2009-06-07 19:46:57

标签: process pipe 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 - 错误的文件描述符。

4 个答案:

答案 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来电之前

行...?