/* vmsplice() system call »ç¿ë ¼³¸í°ú ¿¹Á¦ by hkpco(¹ÚÂù¾Ï), hkpco@korea.com, http://hkpco.kr/ 2008. 2. 14 */ linux kernel 2.6.17 ¿¡¼­ ºÎÅÍ Ãß°¡µÈ vmsplice() ½Ã½ºÅÛ ÄÝ¿¡ ´ëÇÏ¿© ¾Ë¾Æº¸°Ú½À´Ï´Ù. vmsplice() °ü·Ã Ãë¾à¼ºµµ ¹ßÇ¥µÈ Âü¿¡ ¾î¶°ÇÑ ÇÔ¼öÀÎÁö¸¦ »ìÆ캸´Â°Íµµ ³ª»ÚÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù. ºñ±³Àû ÃÖ±Ù¿¡ µîÀåÇÑ ½Ã½ºÅÛ ÄÝ À̱⶧¹®¿¡ ´Ù¼Ò »ý¼ÒÇÑ °¨ÀÌ ¾øÁö¾Ê¾Æ ÀÖ½À´Ï´Ù. man page¿¡¼­´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÏ°í ÀÖ½À´Ï´Ù. ---------------------------------------------------------------- NAME vmsplice - splice user pages into a pipe SYNOPSIS #define _GNU_SOURCE #include #include long vmsplice(int fd, const struct iovec *iov, unsigned long nr_segs, unsigned int flags); ---------------------------------------------------------------- ÆÄÀÌÇÁ ¾ÈÀ¸·Î »ç¿ëÀÚ ÆäÀÌÁö¸¦ »ðÀÔ(?)ÇÑ´Ù°í ¼³¸íµÇ¾î ÀÖ½À´Ï´Ù. ù ¹ø° ÀÎÀÚ´Â ÆÄÀÏ ±â¼úÀÚ, µÎ ¹ø° ÀÎÀÚ´Â ÇØ´ç ½Ã½ºÅÛ ÄÝ¿¡¼­ Á¦°øÇÏ´Â ±¸Á¶Ã¼, ¼¼ ¹ø° ÀÎÀÚ´Â Àü´Þ ÇÒ ±¸Á¶Ã¼ÀÇ °¹¼ö, ¸¶Áö¸·À¸·Î ³× ¹ø° ÀÎÀڴ ƯÁ¤ ±â´ÉÀ» ¼öÇàÇϱâ À§ÇÑ Ç÷¡±× ÀÔ´Ï´Ù. vmsplice() ½Ã½ºÅÛ ÄÝÀÇ µÎ ¹ø° ÀÎÀÚ¸¦ À§Çؼ­ ´ÙÀ½°ú °°Àº ±¸Á¶Ã¼°¡ Á¦°øµË´Ï´Ù. -- struct iovec { void *iov_base; /* Starting address */ size_t iov_len; /* Number of bytes */ }; -- iov_base¿¡´Â vmsplice()¸¦ ÅëÇØ ÆÄÀÌÇÁ¿¡ Àü´Þ ÇÒ µ¥ÀÌÅÍÀÇ ½ÃÀÛ ÁÖ¼Ò°¡, iov_len¿¡´Â ÇØ´ç µ¥ÀÌÅÍÀÇ ±æÀÌ°¡ µé¾î°©´Ï´Ù. ¼³¸í º¸´Ù´Â Äڵ尡 ÀÌÇØÇϱ⿡ ´õ ½¬¿ï °ÍÀÔ´Ï´Ù. ÀÚ, ÀÌÁ¦ºÎÅÍ´Â Çѱ¹¾î°¡ ¾Æ´Ñ C¾ð¾î·Î ¼³¸íÇϵµ·Ï ÇÏ°Ú½À´Ï´Ù. [hkpco@localhost hkpco]$ cat vmsplice.c /* written by hkpco http://hkpco.kr/ */ #include #include #include #include int main( void ) { int rtn; char *buf = "hkpco is ChanAm Park\n"; struct iovec hk; hk.iov_base = (void *)buf; hk.iov_len = strlen(buf); rtn = vmsplice( 1 , &hk , 1 , 0 ); if( rtn < 0 ) return -1; return 0; } [hkpco@localhost hkpco]$ gcc -o vmpslice vmsplice.c [hkpco@localhost hkpco]$ ./vmsplice | cat hkpco is ChanAm Park ÀÌÇØ°¡ µÇ¼Ì³ª¿ä..? vmsplice()´Â ÆÄÀÌÇÁ¿Í ¿¬°üµÈ ½Ã½ºÅÛ ÄÝÀ̱⠶§¹®¿¡ Á¶±Ý ´õ ¿Í´êÀ» ¼ö ÀÖµµ·Ï pipe() ÇÔ¼ö¸¦ Ãß°¡ÇÑ ¿¹Á¦´Â ´ÙÀ½°ú °°½À´Ï´Ù. [hkpco@localhost hkpco]$ gcc -o vmp vmp.c [hkpco@localhost hkpco]$ cat vmp.c /* written by hkpco http://hkpco.kr/ */ #include #include #include #include #include int main( void ) { int rtn, child, pipes[2]; char data[1024]={0x00,}; char *buf1 = "hkpco is ChanAm Park\n", *buf2 = "hkpco.kr is my site\n"; struct iovec hk[2]; if( pipe(pipes) < 0 ) { perror( "pipe()" ); return -1; } child = fork(); if( child == 0 ) { hk[0].iov_base = (void *)buf1; hk[0].iov_len = strlen(buf1); hk[1].iov_base = (void *)buf2; hk[1].iov_len = strlen(buf2); rtn = vmsplice( pipes[1] , &hk , 2 , 0 ); if( rtn < 0 ) return -1; } else { read( pipes[0] , data , sizeof(data) -1 ); printf( "%s" , data ); memset( data , 0x0 , sizeof(data) ); read( pipes[0] , data , sizeof(data) -1 ); printf( "%s" , data ); } return 0; } [hkpco@localhost hkpco]$ gcc -o vmp vmp.c [hkpco@localhost hkpco]$ ./vmp hkpco is ChanAm Park hkpco.kr is my site ÆÄÀÌÇÁ¸¦ ÅëÇØ ¸¹Àº µ¥ÀÌÅ͸¦ ÇѲ¨¹ø¿¡ Àü´ÞÇÒ ¶§ vmsplice()¸¦ ÀÌ¿ëÇϸé À¯¿ëÇÒ °Í °°½À´Ï´Ù. Âü°í·Î µ¥ÀÌÅ͸¦ ¹ÞÀ» ¶§ÀÇ ¼ø¼­´Â FIFO(First In First Out)ÀÔ´Ï´Ù. ÀÌ»óÀ¸·Î vmsplice()¿¡ ´ëÇÑ ÆäÀÌÆÛ¸¦ ¸¶Ä¡°Ú½À´Ï´Ù.