# cp test2 test
cp: cannot create regular file `test': Text file busy
¿´ÆðÀ´ÊdzÌÐò±»Õ¼Óã¬ÎÞ·¨¸²¸Ç¡£ÓÚÊÇ×Ô¼ºÓÖÔÙ×öÁ˼¸¸öʵÑ飺
£¨1£©ÏÈrmɾ³ýÕýÔÚÔËÐеÄtest£¬È»ºócp test2 test¾ÍûÓдíÎóÁË¡£
£¨2£©ÏÈmv¸ÄÃûÕýÔÚÔËÐеÄtest£¬È»ºócp test2 testҲûÓÐÎÊÌâ¡£
²éÁ˲é×ÊÁϲ¢¶¯ÊÖ·ÖÎöÁËһϣ¬ÕÒµ½Á˱ȽÏÂúÒâµÄ½âÊÍ¡£cp²¢²»¸Ä±äÄ¿±êÎļþµÄinode£¬ÊÂʵÉÏËüµÄʵÏÖÊÇÕâÑùµÄ£º
ÒýÓÃ:# strace cp test2 test 2>&1 | grep open.*test
open("test2", O_RDONLY|O_LARGEFILE) = 3
open("test", O_WRONLY|O_TRUNC|O_LARGEFILE) = 4
ÎÒÔÒÔΪcpµÄʵÏÖÊÇ¡°rm + open(O_CREAT)¡±£¬²»¹ýÏÖÔÚÏëÏëÉÏÃæµÄʵÏÖ·½Ê½²ÅÊÇ×î¿É¿¿µÄ£¨±£Ö¤ÁËʱÐò°²È«ºÍÄ¿±êÎļþµÄÊôÐÔ£©¡£ÕâÒ²¿ÉÒÔ½âÊÍΪʲôcpµÄÄ¿±êÎļþ»á¼Ì³Ð±»¸²¸ÇÎļþµÄÊôÐÔ¶ø·ÇÔ´Îļþ¡£
LinuxÓÉÓÚDemand Paging»úÖƵĹØϵ£¬±ØÐëÈ·±£ÕýÔÚÔËÐÐÖеijÌÐò¾µÏñ£¨×¢Ò⣬²¢·ÇÎļþ±¾Éí£©²»±»ÒâÍâÐ޸ģ¬Òò´ËÄÚºËÔÚÆô¶¯³ÌÐòºó»áËø¶¨Õâ¸ö³ÌÐò¾µÏñµÄinode¡£Õâ¾ÍÊÇΪʲôcpÔÚÓá°O_WRONLY|O_TRUNC¡±Ä£Ê½openÄ¿±êÎļþʱ»áʧ°Ü¡£¶øÏÈrmÔÙcpµÄ»°£¬ÐÂÎļþµÄinodeÆäʵÒѾ¸Ä±äÁË£¬Ôinode²¢Ã»Óб»ÕæÕýɾ³ý£¬Ö±µ½ÄÚºËÊͷŶÔËüµÄÒýÓá£Í¬Àí£¬mvÖ»ÊǸıäÁËÎļþÃû£¬Æäinode²»±ä£¬ÐÂÎļþʹÓÃÁËеÄinode¡£
ÎÊÌâµ½ÕâÀïÒѾˮÂäʯ³ö£¬²»¹ýÅÙ¸ù¾¿µ×µÄ¸öÐÔÇýʹÎÒÔÙ×öÁËÒÔÏÂÒ»×éʵÑ飬ûÏëµ½½á¹ûÍêÈ«³öºõÎÒÒâÁÏÖ®Í⣡
дÁËÒ»¸ö¼òµ¥µÄ²âÊÔ³ÌÐò£º
ÒýÓÃ:#include
int main(int argc, char * argv[])
{
foo(); // An export function by libtest.so.
sleep(1000);
return 0;
}foo()
ÊÇÁíÒ»¸ö²âÊÔ¶¯Ì¬¿âlibtest.soµÄµ¼³ö½Ó¿Ú£¬Ö»´òÓ¡Ò»ÐÐÌáʾ¾Í·µ»Ø¡£½ÓÏÂÀ´ÎÒ°ÑÉÏÃæ¶ÔÖ´ÐÐÎļþµÄ²âÊÔÓÃÀý¶Ô¶¯Ì¬¿âÓÖ×öÁËÒ»±é£º
£¨1£©cp libtest2.so libtest.so¿ÉÒÔÖ±½Ó¸²¸ÇÒѼÓÔصĶ¯Ì¬¿â¡£
£¨2£©ÏÈrmɾ³ýÒѼÓÔصÄlibtest.so£¬È»ºócp libtest2.so libtest.so³É¹¦¡£
£¨3£©ÏÈmv¸ÄÃûÒѼÓÔصÄlibtest.so£¬È»ºócp libtest2.so libtest.so³É¹¦¡£
³ýÁ˵ÚÒ»¸öÓÃÀýÍ⣬½á¹ûÏàͬ¡£ÕâÑù¿´À´£¬¶¯Ì¬¿â±»¼ÓÔØʱÄѵÀld²¢Ã»ÓÐËø¶¨inode£¿²»¹ýÏëÏëÒ²¿ÉÒÔ¿íË¡£¬±Ï¾¹ldÒ²ÊÇÓû§Ì¬³ÌÐò£¬Ã»ÓÐȨÀûÈ¥Ëø¶¨inode£¬Ò²²»Ó¦ÓëÄں˵ÄÎļþϵͳµ×²ãʵÏÖñîºÏ¡£
µ½ÕâÀﶼ»¹ËãÔÚÇéÀíÖ®ÖУ¬¿´ÆðÀ´LinuxÒ²¶¼´¦ÀíµÄºÜºÃ¡£²»¹ý»¹Ê£ÏÂÒ»¸öÎÊÌ⣺¶¯Ì¬¿â±»ÒÔcpµÄ·½Ê½¸²¸ÇºóÄѵÀ²»»áºÍDemand Paging»úÖƲúÉú³åÍ»£¿
ÔÚ˼¿¼Õâ¸öÎÊÌâµÄ¹ý³ÌÖУ¬ÎÒÒâʶµ½Ç°ÃæÕâ¸ö²âÊÔ³ÌÐòµÄÒ»¸öÖÂÃü©¶´£¬ÉÔ×÷ÐÞ¸ÄÈçÏ£º
ÒýÓÃ:#include
int main(int argc, char * argv[])
{
loop:
foo(); // An export function by libtest.so.
sleep(1);
goto loop;
return 0;
}
Õâ´Î£¬ÔÙÖ´ÐÐÉÏÃæµÄÈý¸öÓÃÀýºó·¢ÏÖ£¬¡°cp libtest2.so libtest.so¡±ËäÈ»ÈÔ¿ÉÖ±½Ó¸²¸ÇÒѼÓÔصĶ¯Ì¬¿â£¬µ«ÊDzâÊÔ³ÌÐòÂíÉϳöÏÖÁË¡°Segmentation fault¡±¡£¶øºóÁ½¸öÓÃÀý½á¹û²»±ä¡£Óɴ˿ɼû£¬ÏëÒª°²È«µÄÌæ»»ÒѼÓÔصĶ¯Ì¬¿â£¬»¹ÊÇÓá°±¿×¾¡±µÄ¡°rm + cp¡±°É£¬¿´Ëƽݾ¶µÄ¡°cp¸²¸Ç¡±»áÖ±½ÓÔáË͵ôÄãµÄ³ÌÐò¡£
¿´À´£¬ÎÒÔÙÒ»´ÎµÍ¹ÀÁËLinuxµÄ½¡×³ÐÔ£¬¿´ËÆ·ûºÏÂß¼µÄÁ÷³ÌÒ²¿ÉÄÜ»á´øÀ´ÔÖÄÑÐԵĺó¹û£»¡°rm & cp¡±Óë¡°cp¸²¸Ç¡±±³ºóËùÒþ²ØµÄµ×²ã²îÒìÈ´¿ÉÒÔ³ÉΪÄãµÄ¾ÈÐÇ¡£LinuxÓõÃÔ½¾ÃÔ½ÊÇÈÃÈ˾õµÃÕâÊÇÒ»¿é³äÂúÁ˾£¼¬ºÍÏÝÚåµÄÔʼ´ÔÁÖ£¬Ö»Óв½²½ÎªÓªÊµÌ¤Ç°ÐвÅÄÜ×ߵĸüÔ¶¡£
×¢£ºÒÔÉÏʵÑé»ùÓÚSuSE Linux Enterprise Server 9 SP1£¨Linux 2.6.5 & glibc 2.3.3£©¡£