欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

调用linux的write向socket写数据的时分出现pipe损坏提示

更新时间: 2014-01-05 01:58:19 责任编辑: Author_N1

 

调用Linux的write向socket写数据的时候出现PIPE损坏提示
现在在改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);还是会出现上面的问题。
请问这种情况应该怎样解决?
--参考方法--
是不是客户端已经关闭了?
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 01:58:19
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/3865/
本文WWW.DOC100.NET DOC100.NET版权所有。