LinuxSir.cn,穿越时空的Linuxsir!

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

关闭一个流,会影响和其关联的描述符吗?

[复制链接]
发表于 2005-1-10 14:41:29 | 显示全部楼层 |阅读模式
int sock = connect(……);
func()
{
     FILE *in = fdopen(……);
     //用流进行读写
     
     fclose(in);
}

如上,发现如果在func中fclose(),则在func外sock==-1,即sock也被关掉了;
有办法在用完流之后关闭流,但能继续使用原来的descriptor吗?
求解,谢谢!
发表于 2005-1-10 17:53:33 | 显示全部楼层
fclose(in)要调用close()来关闭描述符,既然还要用就不要关闭
 楼主| 发表于 2005-1-10 21:54:10 | 显示全部楼层
我写个c/s结构的网络程序遇到这样的问题:
server端:

  1.         char buf[1024];
  2.         int sock = accept(-----);
  3.         FILE *out = fdopen(sock);
  4.         FILE *tmpFile = fdopen(mkstemp("tmpXXXXX"));
  5.        //写入tmpXXXXXX的文件内容
  6.         while([color=Magenta]fgets(buf,sizeof(buf),tmpFile)[/color] != NULL)
  7.         {
  8.                 fputs(buf,out);
  9.                 fflush(out);
  10.         }
  11.         //不fclose(out);
复制代码


client端:

  1.         int sock = connect(------);
  2.         char buf[1024];
  3.         FILE *out,*in;
  4.         out = fdopen(STDOUT_FILENO,"r+");
  5.         in = fdopen(sock,"r");

  6.         while(fgets(buf,sizeof(buf),in) != NULL)
  7.         {
  8.                 fputs(buf,out);
  9.         }
复制代码


上述代码意在将某个临时文件(比如"ls -l > tmpFile"得到的文件)的内容发到client,在client端将套接字流绑定到STDOUT_FILINO,直接将读到的内容输出到屏幕。

但是,在输出完文件内容后,堵在彩色那一句上跳不出while
发表于 2005-1-11 09:16:43 | 显示全部楼层
是客户端跳不出来吧?如果客户端这样判断循环结束,那服务器端的确需要close

在socket编程的时候好像很少使用FILE*来打开sock
发表于 2005-1-11 09:56:21 | 显示全部楼层
从 man fgets里摘录的:
...
fgets() reads in at most one less than size characters from stream  and
       stores  them  into  the buffer pointed to by s.  Reading stops after an
       EOF or a newline.
...
gets() and fgets() return s on success, and NULL on error or  when  end
       of file occurs while no characters have been read.
...
由于sock是流,不是文件,所以不会发生读到EOF的情况,只要sock不出错,fgets就永远不会返回NULL, 在没有输入时应该发生阻塞,即程序停留在fgets上。
 楼主| 发表于 2005-1-11 11:54:48 | 显示全部楼层
谢谢各位!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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