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

LinuxÏ¿ÉÒÔÌæ»»ÔËÐÐÖеijÌÐòô

·¢²¼Ê±¼ä:2008-06-29 00:34:30À´Ô´:ºìÁª×÷Õß:Members
½ñÌì±»ÅóÓÑÎʼ°¡°LinuxÏ¿ÉÒÔÌæ»»ÔËÐÐÖеijÌÐòô£¿¡±£¬ÒÔÇ°ÒÀÏ¡¼ÇµÃLinuxÏÂÊÇ¿ÉÒԵģ¨¶øWindows¾Í²»Èã©£¬ÓÚÊÇËæ¿Ú´ðµÀ¡°OK¡±¡£½á¹ûÅóÓÑ·¢À´Ò»¸öÖ´Ðнá¹û£º£¨testÕýÔÚÔËÐÐÖУ©

# 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£©¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ