ºìÁªLinuxÃÅ»§
Linux°ïÖú

LinuxÏÂÌá¸ßÐÔÄܵÄϵͳµ÷ÓÃsendfile£¬spliceºÍtee

·¢²¼Ê±¼ä:2006-11-14 01:06:50À´Ô´:ºìÁª×÷Õß:cookies
ÊìϤLinuxÄÚºË2.4°æ±¾µÄÒ²ÐíÖªµÀ£ºÔÚ2.4°æµÄÄÚºËÖÐÄÚǶÁËÒ»¸ö½Ð×ökhttpdµÄ¾²Ì¬ÍøÒ³·þÎñÆ÷¡£µ±Ê±£¬¿ÉÄÜÊÇЧÂʵÄÒòËØÖÂʹËý±»Ìí¼ÓÁ˽øÀ´£¬ÖÁÓÚΪʲô×îеÄ2.6°æÄÚºËÈ¥µôÁËÕâ¸ö·þÎñÆ÷£¬ÎÒ¿¼ÂÇ¿ÉÄÜÊÇÒòΪLinuxÄںˡ°Ö»Ìṩ»úÖÆ£¬¶ø²»Ìṩ²ßÂÔ¡±£¬µ±È»°²È«ÒòËØÒ²²»ÄÜÅųýÔÚÍâ¡£

ʵ¼ÊÉÏ£¬°ÑÍøÒ³·þÎñÆ÷×ö½øÄÚºËÒ²ÊÇÍêȫûÓбØÒªµÄ£¬ÒòΪLinuxÄÚºËÌṩÁËsendfileÕâÑùÒ»¸öϵͳµ÷Óãº

ÒýÓÃ:
#include

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);


ËýÄܰÑÒ»¸öÎļþ´ÓÌØ¶¨²¿·Ö¿ªÊ¼µÄÌØ¶¨¿éͨ¹ýÒ»¸ösocket·¢ËͳöÈ¥£¬´Ó¶ø±ÜÃâÁ˶à´Îµ÷ÓÃreadºÍwriteµÄÄÚºËÉÏÏÂÎĺÍÓû§ÉÏÏÂÎÄÇл»µÄ¿ªÏú£¬²¢ÇÒÓÉÓÚÆäÄÚ²¿ÊµÏÖÀûÓÃÁËmmap¼¼Êõ£¬Ò²¼õÉÙÁËÄÚ´æµÄ¸´ÖÆ¿ªÏú¡£ÓÐÁËËý£¬ÇëÎÊkhttpd»¹ÓÐÄÇô±ØÒªÃ´£¿

spliceºÍteeÊÇ2.6.17°æµÄLinuxÄÚºËÊ×´ÎÒýÈëµÄ:

ÒýÓÃ:
#define _GNU_SOURCE
#include

long splice(int fd_in, off_t *off_in, int fd_out,
off_t *off_out, size_t len, unsigned int flags);


ÒýÓÃ:
#define _GNU_SOURCE
#include

long tee(int fd_in, int fd_out, size_t len, unsigned int flags);


ÕâÁ½¸öÖ÷ÒªÓÃÀ´¼õÉٹܵÀºÍÆäËûÃèÊö·ûÖ®¼ä´«µÝÊý¾ÝʱµÄreadºÍwriteϵͳµ÷ÓõÄÊýÄ¿£¬ÏêϸÓ÷¨Çë²é¿´manÒ³£¬ÆäÖÐteeµÄmanÒ³Öл¹¸ø³öÁ˲ÉÓÃspliceºÍteeÖØÐÂʵÏÖµÄÒ»¸öteeÃüÁî×÷ΪʾÀý£¬ÈçÓÐÐËȤ£¬¿É²é¿´Ò»Ï¡£

ÓëËûÃÇһͬÒýÈëµÄ»¹ÓÐvmsplice:

ÒýÓÃ:
#define _GNU_SOURCE
#include
#include

long vmsplice(int fd, const struct iovec *iov,
unsigned long nr_segs, unsigned int flags);


Õâ¸öϵͳµ÷Óý«Óû§¿Õ¼äµÄÄÚ´æÓ³Éäµ½Äں˿ռ䣬´Ó¶ø±ÜÃâÁËʵ¼ÊµÄÄÚ´æÐ´²Ù×÷£¬Ìá¸ßÁËϵͳЧÂÊ¡£

²»¹ý£¬ÎÒ²¢Ã»ÓоõµÃsplice£¬teeºÍvmspliceÔÚʵ¼ÊµÄ´úÂëÖкܡ°ÓÐÓá±£¬µ¹ÊǾõµÃÈç¹ûÄÜÈ¥³ý¶Ô¹ÜµÀµÄÏÞÖÆ¸üºÃЩ¡£ÒòΪËíµÀÐ͵ĴúÀí·þÎñ³ÌÐò£¬ÔÚÁ¬½Ó½¨Á¢ºó£¬Ê£ÏµÄÖ÷ÒªÈÎÎñ¾ÍÊÇÔÚÁ½¸ösocketÖ®¼ä»¥ÏàrelayÊý¾Ý£¬Èç¹ûÄܰÑËûÃÇspliceÆðÀ´£¬»¹ÊÇÄÜÔÚÒ»¶¨³Ì¶ÈÉÏÌá¸ßЧÂʵġ£ºÇºÇ£¬ÖÚ¿ÚÄѵ÷£¡

Ï£ÍûÒÔÉϽéÉܶԴó¼ÒÓÐÒæ£¡
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 1 ÌõÆÀÂÛ

  1. coolbg ÓÚ 2006-11-14 16:00:15·¢±í:

    ѧϰÁË£¬¶¥Ò»¸ö