LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3891|回复: 14

套接字描述符如何传给子进程?

[复制链接]
发表于 2004-12-30 20:27:23 | 显示全部楼层 |阅读模式
一个支持并发的服务器端,父进程接受连接后将sock descriptor通过管道传给子进程,由子进程处理。
但是子进程里传入的sock desp运行时显示是个"bad descriptor",而在父进程里却可以正常read。不解!?
还有,复制sock desp的时候,应该dup()还是直接用“=”就可以了??
谢谢
发表于 2004-12-30 21:29:48 | 显示全部楼层
子进程继承了父进程的所有fd
复制当然是用dup/dup2
发表于 2004-12-31 11:16:18 | 显示全部楼层
Post by dongp
子进程继承了父进程的所有fd

从楼主的情况来看,连接的套接字是在fork()之后,此时父子进程已经完全独立,子进程怎么继承父进程的所有fd?
发表于 2004-12-31 11:17:02 | 显示全部楼层
Post by jadywang
一个支持并发的服务器端,父进程接受连接后将sock descriptor通过管道传给子进程,由子进程处理。
但是子进程里传入的sock desp运行时显示是个"bad descriptor",而在父进程里却可以正常read。不解!?
还有,复制sock desp的时候,应该dup()还是直接用“=”就可以了??
谢谢

估计管道部分的代码有问题,自己好好研究下先。
 楼主| 发表于 2004-12-31 14:07:05 | 显示全部楼层
我做了个实验,试着传文件描述符。

  1. int main()
  2. {
  3.         int fd,pid;
  4.         int pd[2];
  5.         socketpair(AF_UNIX,SOCK_STREAM,0,pd);
  6.         char buf[30];
  7.         //printf("fd = %d\n",fd);
  8.         pid = fork();
  9.         if(pid == 0)        //child
  10.         {
  11.                 close(pd[0]);
  12.                 read(pd[1],&fd,sizeof(int));
  13.                 if(read(fd,buf,30) == -1)
  14.                         printf("In child,fd=%d\n",fd);
  15.                 else{
  16.                         printf("In child: %s\n",buf);
  17.                 }
  18.         }
  19.         if(pid >0)        //parent
  20.         {
  21.                 close(pd[1]);
  22.                 fd = open("select_serv.c",O_RDONLY,00700);
  23.                 [color=Magenta]//int tmp_fd = dup(fd);[/color]
  24.                 [color=Lime]int tmp_fd = fd;[/color]
  25.                 printf("In parent,tmp_fd=%d\n",tmp_fd);
  26.                 write(pd[0],&fd,sizeof(int));
  27.         }
  28.         return 0;
  29. }
复制代码

注意彩色两行,当用“int tmp_fd = dup(fd);”时,子进程里显示坏的描述符;
当用“int tmp_fd = fd”时,子进程里的read可以执行,但是读到的总是一个ascii码 值为01。
哪位解释一下,谢谢
发表于 2004-12-31 15:46:37 | 显示全部楼层
不看代码真不知道楼主概念糊涂。文件描述符和套接字都是一个进程的私有资源,怎么可能去和另一个进程共享。这样做是没有意义的。有兴趣还是先看看操作系统原理的文件系统部分吧。
发表于 2004-12-31 22:55:13 | 显示全部楼层
在accept之后fork,不就没有问题了吗。
父子进程间传递套接字也是可以的,因为套接字和文件描述符不同,它是属于操作系统内的资源。具体例子可以看《unix网络编程第一卷》第2版的27.9节。
发表于 2005-1-1 10:56:09 | 显示全部楼层
Post by svenwang

父子进程间传递套接字也是可以的,因为套接字和文件描述符不同,它是属于操作系统内的资源。具体例子可以看《unix网络编程第一卷》第2版的27.9节。

难道文件描述符就不是操作系统内的资源啦?如果是,是不是进程间传递文件描述符也可以呀?
我先坚持我原来的观点,《unix网络编程第一卷》我还没有看过,等我看了书之后再说。
发表于 2005-1-1 19:35:03 | 显示全部楼层
进程间传递文件描述符是可以的,APUE第十五章有讲,unp上也有
传递文件描述符就是使两个进程的两个文件描述府指向内核中相同的文件表
发表于 2005-1-1 21:17:14 | 显示全部楼层
Post by yangtou
进程间传递文件描述符是可以的,APUE第十五章有讲,unp上也有
传递文件描述符就是使两个进程的两个文件描述府指向内核中相同的文件表

《APUE》上所说的实际上指两个进程交换它们对文件表的引用。这实际上并不是真正在交换文件描述符。文件描述符始终是进程的私有数据,不会被其它进程所共享。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表