调用Linux的write向socket写数据的时候出现PIPE损坏提示

thinkperson_x201 2013-05-10 04:58:09
现在在改nginx代码,遇到的问题如下:
nginx原先使用Linux系统函数sendfile()来将客户端请求的文件发送到客户端,这个函数效率较高,避免了频繁的内存拷贝和上下文切换。
在nginx中,sendfile()是这样使用的:

//@c->fd: socket句柄
//@file->file->f: 文件句柄
//@offset: 文件偏移量
//@file_size: 文件总大小
sendfile(c->fd, file->file->fd, &offset, file_size);

现在根据业务需要,不适用sendfile(),进行下面的改动:
u_char read_buf[2271682] = {0}; //存储整个整个文件的buf
read(file->file->fd, read_buf, 2271682);
write(c->fd, read_buf, 2271682);

上面的过程相当于将这个文件先读入内存,然后再整体写入socket,发送到客户端。功能是正常的。


但上面的写法太不灵活,需要将文件整体读入内存,开销太大,所以考虑使用分段读入内存,分段发送到客户端:
int n_offset = 0; //文件偏移量
int n_read = 0; //读取到的字节数
int n_write = 0;
u_char read_buf[32768] = {0}; //32K的buf
while(n_offset < 2271682)
{
n_read = 0;
memset(read_buf, 0, 32768);
n_read = lseek(file->file->fd, read_buf, 32768);
n_offset += n_read;
n_write = write(c->fd, read_buf, n_read);
}

但是上面的方式总是会出现提示:Program received signal SIGPIPE。即使加上signal(SIGPIPE, SIG_IGN);还是会出现上面的问题。
请问这种情况应该怎样解决?
...全文
175 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
thinkperson_x202 2013-05-15
  • 打赏
  • 举报
回复
是不是客户端已经关闭了?
内容概要:本文围绕“单相逆变器闭环逆变电路PWM模型仿真研究”展开,基于Simulink平台构建单相逆变器的闭环控制系统仿真模型,重点研究PWM调制技术在逆变电路中的应用与实现。文中详细阐述了系统架构设计、电压电流双闭环控制策略的实现原理、控制器参数设计及仿真建模全过程,并通过仿真结果验证了控制方案在动态响应、稳态精度与系统稳定性方面的有效性。同时,文档还涵盖多种电力电子系统典型应用场景,如多类型短路故障仿真(中性点不接地、经小电阻接地、经消弧线圈接地等)、软开关技术、微电网能量管理、MPPT控制等,体现出较强的技术综合性和工程实践价值。; 适合人群:电气工程、自动化、电力电子与新能源等相关专业的高校本科生、研究生、科研人员,以及从事电力系统仿真、逆变器设计与新能源并网技术研发的工程技术人员。; 使用场景及目标:①掌握基于Simulink的单相逆变器闭环控制系统建模与PWM仿真方法;②深入理解双闭环控制、SPWM/SVPWM调制、系统稳定性分析等核心技术原理;③为课程设计、毕业设计、科研项目或实际工程开发提供可复用的仿真模型与技术支持; 阅读建议:建议结合文中仿真模型动手实践,重点掌握PI控制器参数整定、PWM信号生成机制与仿真结果分析方法,同时可延伸学习文档中涉及的软开关、故障仿真、微电网控制等关联技术,以拓展系统级设计能力。

25,980

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧