【发布时间】:2013-12-16 08:00:10
【问题描述】:
我最近在读 CSAPP。在 10.9 节中,它说标准 I/O 不应该与 socket 一起使用,原因如下:
(1)标准I/O的限制
限制 1:输入函数跟随输出函数。输入 如果没有介入调用,函数不能跟随输出函数 fflush、fseek、fsetpos 或倒带。 fflush 函数清空 与流关联的缓冲区。后三个函数使用 Unix I/O lseek 函数重置当前文件位置。
限制 2:输出函数遵循输入函数。输出 如果没有介入调用,函数不能跟随输入函数 fseek、fsetpos 或 rewind,除非输入函数遇到 文件结束。
(2) 在socket上使用lseek函数是非法的。
问题 1:如果我违反了限制会怎样?我写了一个代码sn-p,效果很好。
问题 2:绕过限制 2,一种方法如下:
File *fpin, *fpout;
fpin = fdopen(sockfd, "r");
fpout = fdopen(sockfd, "w");
/* Some Work Here */
fclose(fpin);
fclose(fpout);
教科书上说,
在线程程序中关闭已经关闭的描述符是 灾难的秘诀。
为什么?
【问题讨论】:
标签: c sockets standard-library