BBSˮľÇ廪վ¡Ã¾«»ªÇø
·¢ÐÅÈË: SuperSB (¹ÂÓ¥), ÐÅÇø: Linux
±ê Ìâ: [×ªÔØ]unix»·¾³¸ß¼¶±à³Ì-12
·¢ÐÅÕ¾: BBS ˮľÇ廪վ (Wed Mar 15 14:30:35 2000)
·¢ÐÅÈË: taosm (128+64-->cool), ÐÅÇø: unix
±ê Ìâ: unix»·¾³¸ß¼¶±à³Ì--µÚ12Õ ¸ß¼¶I/O
·¢ÐÅÕ¾: Î÷Ê®°ËBBS (Sat Mar 11 13:50:56 2000), תÐÅ
µÚÊ®¶þÕ ¸ß¼¶I/O
12.1 ÒýÑÔ
±¾ÕÂÄÚÈݰüÀ¨£º·Ç×èÈûI/O¡¢¼ÇÂ¼Ëø¡¢ÏµÍ³VÁ÷»úÖÆ¡¢I/O¶à·ת½Ó£¨selectºÍpoll
º¯Êý£©¡¢readvºÍwritevº¯Êý£¬ÒÔ¼°´æ´¢Ó³ÕÕI/O£¨mmap£©¡£ÔÚµÚÊ®ËÄÕ¡¢Ê®ÎåÕÂÖÐ
˵Ã÷µÄ½ø³Ì¼äͨÐÅ£¬ÒÔ¼°ÒÔºó¸÷ÕÂÖеĺܶàʵÀý¶¼ÒªÊ¹Óñ¾ÕÂËùÊöµÄ¸ÅÄîºÍº¯Êý¡£
12.2 ·Ç×èÈûI/O
ÔÚ10.5½ÚÖÐÔø½«ÏµÍ³µ÷Ó÷ֳÉÁ½ÀࣺµÍËÙϵͳµ÷ÓÃºÍÆäËü¡£µÍËÙϵͳµ÷ÓÃÊÇ¿ÉÄÜ»á
ʹ½ø³ÌÓÀÔ¶×èÈûµÄÒ»Ààϵͳµ÷Óãº
l Èç¹ûÊý¾Ý²¢²»´æÔÚ£¬Ôò¶ÁÎļþ¿ÉÄÜ»áʹµ÷ÓÃÕßÓÀÔ¶×èÈû£¨ÀýÈç¶Á¹ÜµÀ£¬ÖÕ¶ËÉ豸
ºÍÍøÂçÉ豸£©¡£
l Èç¹ûÊý¾Ý²»ÄÜÁ¢¼´±»½ÓÊÜ£¬ÔòдÕâЩͬÑùµÄÎļþÒ²»áʹµ÷ÓÃÕßÓÀÔ¶×èÈû¡£
l ÔÚijЩÌõ¼þ·¢Éú֮ǰ£¬´ò¿ªÎļþ»á±»×èÈû£¨ÀýÈç´ò¿ªÒ»¸öÖÕ¶ËÉ豸¿ÉÄÜÐèµÈ´ýµ½
Ò»¸öÁ¬½ÓµÄµ÷ÖÆ½âµ÷Æ÷Ó¦´ð£»ÓÖÀýÈçÈôÒÔֻд·½Ê½´ò¿ªFIFO£¬ÄÇôÔÚûÓÐÆäËü½ø³Ì
ÒÑÓöÁ·½Ê½´ò¿ª¸ÃFIFOʱҲҪµÈ´ý£©¡£
l ¶ÔÒѾ¼ÓÉÏÁËÇ¿ÖÆÐÔ¼ÇÂ¼ËøµÄÎļþ½øÐжÁ¡¢Ð´¡£
l ijЩioctl²Ù×÷¡£
l ijЩ½ø³Ì¼äͨÐź¯Êý£¨µÚÊ®ËÄÕ£©¡£
ËäÈ»¶Á¡¢Ð´´ÅÅÌÎļþ»áʹµ÷ÓÃÔÚ¶ÌÔÝʱ¼äÄÚ×èÈû£¬µ«²¢²»Äܽ«ËüÃÇÊÓΪ"µÍËÙ"¡£
·Ç×èÈûI/OʹÎÒÃÇ¿ÉÒÔµ÷Óò»»áÓÀÔ¶×èÈûµÄI/O²Ù×÷£¬ÀýÈçopen,readºÍwrite¡£Èç¹û
ÕâÖÖ²Ù×÷²»ÄÜÍê³É£¬ÔòÁ¢¼´³ö´í·µ»Ø£¬±íʾ¸Ã²Ù×÷Èç¼ÌÐøÖ´Ðн«¼ÌÐø×èÈûÏÂÈ¥¡£
¶ÔÓÚÒ»¸ö¸ø¶¨µÄÃèÊö·ûÓÐÁ½ÖÖ·½·¨¶ÔÆäÖ¸¶¨·Ç×èÈûI/O£º
1. Èç¹ûÊǵ÷ÓÃopenÒÔ»ñµÃ¸ÃÃèÊö·û£¬Ôò¿ÉÖ¸¶¨O_NONBLOCK±êÖ¾£¨3.3½Ú£©¡£
2. ¶ÔÓÚÒѾ´ò¿ªµÄÒ»¸öÃèÊö·û£¬Ôò¿Éµ÷ÓÃfcntl£¬¶ÔÆä´ò¿ªO_NONBOCKÎļþ״̬±ê
Ö¾£¨3.13½Ú£©¡£ÔÚ³ÌÐò3.5Öеĺ¯Êý¿ÉÓÃÀ´ÎªÒ»¸öÃèÊö·û´ò¿ªÈÎÒ»Îļþ״̬±êÖ¾¡£
ÔçÆÚµÄϵͳV°æ±¾Ê¹ÓñêÖ¾O_NDELAYÖ¸¶¨·Ç×èÈû·½Ê½¡£ÔÚÕâЩ°æ±¾ÖУ¬Èç¹ûÎÞÊý¾Ý
¿É¶Á£¬Ôòread·µ»ØÖµ0¡£¶øUnixÓÖ³£½«readµÄ·µ»ØÖµ0½âÊÍΪÎļþ½áÊø£¬Á½ÕßÓÐËù»ì
Ïý¡£PISIX.1ÔòÌṩÁËÒ»¸ö·Ç×èÈû±êÖ¾£¬ËüµÄÃû×ÖºÍÓïÒå¶¼ÓëO_NDELAY²»Í¬¡£PISI
X.1ÒªÇ󣬶ÔÓÚÒ»¸ö·Ç×èÈûµÄÃèÊö·ûÈç¹ûÎÞÊý¾Ý¿É¶Á£¬Ôòread·µ»Ø-1£¬²¢ÇÒerrno±»
ÉèÖÃΪEAGAIN¡£SVR4Ö§³Ö½ÏÀϵÄO_NDELAYºÍPOSIX.1µÄO_NONBLOCK£¬µ«ÔÚ±¾ÊéµÄʵ
ÀýÖÐֻʹÓÃPOSIX.1¹æ¶¨µÄÌØÕ÷¡£O_NDELAYÊÇΪÁËÏòºó¼æÈÝÐÔ£¬²»Ó¦ÔÚÐÂÓ¦ÓóÌÐò
ÖÐʹÓá£
4.3BSDΪfcntlÌṩFNDELAY±êÖ¾£¬ÆäÓïÒåÒ²ÉÔÓÐÇø±ð¡£Ëü²»Ö»Ó°Ïì¸ÃÃèÊö·ûµÄÎļþ
״̬±êÖ¾£¬Ëü½«ÖÕ¶ËÉ豸»òÌ׽ӿڵıêÖ¾¸ü¸Ä³É·Ç×èÈûµÄ£¬Òò´ËÓ°ÏìÁËÖÕ¶Ë»òÌ×½Ó
¿ÚµÄËùÓÐÓû§£¬²»Ö»ÊÇÓ°Ïì¹²ÏíͬһÎļþ±íÏîµÄÓû§£¨4.3BSD·Ç×èÈûI/OÖ»¶ÔÖÕ¶Ë
ºÍÌ×½Ó¿ÚÆð×÷Óã©¡£Èç¹û¶ÔÒ»¸ö·Ç×èÈûÃèÊö·ûµÄ²Ù×÷²»ÄÜÎÞ×èÈûµØÍê³É£¬ÄÇô4.3
BSD·µ»ØEWOULDBLOCK¡£4.3+BSDÌṩPOSIX.1µÄO_NONBLOCK±êÖ¾£¬µ«ÆäÓïÒåÈ´ÀàËÆÓÚ
4.3BSDµÄFNDELAY¡£·Ç×èÈûI/Oͨ³£ÓÃÀ´´¦ÀíÖÕ¶ËÉ豸»òÍøÂçÁ¬½Ó£¬¶øÕâЩÉ豸ͨ³£
Ò»´ÎÓÉÒ»¸ö½ø³ÌʹÓá£Õâ¾ÍÒâζ×ÅBSDÓïÒåµÄ¸ü¸Äͨ³£²»»áÓ°ÏìÎÒÃÇ¡£³ö´í·µ»ØEW
OULDBLOCK¶ø²»ÊÇPOSIX.1µÄEAGAIN£¬ÕâÔì³ÉÁË¿ÉÒÆÖ²ÐÔÎÊÌ⣬ÎÒÃDZØÐë´¦ÀíÕâÒ»ÎÊ
Ìâ¡£4.3+BSDÒ²Ö§³ÖFIFO£¬·Ç×èÈûI/OÒ²¶ÔFIFOÆð×÷Óá£
ʵÀý
³ÌÐò12.1ÊÇÒ»¸ö·Ç×èÈûI/OµÄʵÀý£¬Ëü´Ó±ê×¼ÊäÈë¶Á100£¬000×Ö½Ú£¬²¢ÊÔͼ½«ËüÃÇ
дµ½±ê×¼Êä³öÉÏ¡£¸Ã³ÌÐòÏȽ«±ê×¼Êä³öÉèÖÃΪ·Ç×èÈûµÄ£¬È»ºóÓÃforÑ»·½øÐÐÊä³ö
£¬Ã¿´ÎдµÄ½á¹û¶¼ÔÚ±ê×¼³ö´íÉÏ´òÓ¡¡£º¯Êýctl-f1ÀàËÆÓÚ³ÌÐò3.5ÖеÄset-f1£¬µ«
Óëset-f1µÄ¹¦ÄÜÏà·´£¬ËüÇå³ý1¸ö»ò¶à¸ö±ê־λ¡£
#include <sys/types.h>
#include <errno.h>
#include <fcntl.h>
#include "ourhdr.h"
char buf[100000];
int
main(void)
{
int ntowrite, nwrite;
char *ptr;
ntowrite = read(STDIN_FILENO, buf, sizeof(buf));
fprintf(stderr, "read %d bytes\n", ntowrite);
set_fl(STDOUT_FILENO, O_NONBLOCK); /* set nonblocking */
for (ptr = buf; ntowrite > 0; ) {
errno = 0;
nwrite = write(STDOUT_FILENO, ptr, ntowrite);
fprintf(stderr, "nwrite = %d, errno = %d\n", nwrite, errno);
if (nwrite > 0) {
ptr += nwrite;
ntowrite -= nwrite;
}
}
clr_fl(STDOUT_FILENO, O_NONBLOCK); /* clear nonblocking */
exit(0);
}
³ÌÐò12.1 ³¤µÄ·Ç×èÈûд
Èô±ê×¼Êä³öÊÇÆÕͨÎļþ£¬Ôò¿ÉÒÔÆÚÍûwriteÖ»Ö´ÐÐÒ»´Î¡£
$ ls -l /etc/termcap
Ó¡Îļþ³¤¶È
-rw-rw-r-1 root 133439 Oct 11 1990 /etc/termcap
$a.out < /etc/termcap >temp.file ÏÈÊÔÒ»ÆÕ
Îļþ
read 100000 bytes
nwrite-100000, errno=0 Ò»´Îд
$ls -l temp.file
ÑéÊä³öÎļþ³¤¶È
-rw-rw-r-1 stevens 100000 Nev 21 16:27 temp.file
µ«ÊÇ£¬Èô±ê×¼Êä³öÊÇÖÕ¶Ë£¬Ôò¿ÉÆÚÍûwriteÓÐʱ»á·µ»ØÒ»¸öÊý×Ö£¬ÓÐʱÔò³ö´í·µ»Ø
¡£ÏÂÃæÊÇÔÚÒ»¸öϵͳÉÏÔËÐгÌÐò12.1µÄ½á¹û£º
$ a.out < /etc/termcap 2>stderr.out ÏòÖÕ¶ËÊä³ö
´óÁ¿Êä³öÖÁÖÕ¶Ë
$ cat stderr.out
read 100000 bytes
nwrite=8192, errno=0
nwrite=8192, errno=0
nwrite=-1, errno=11
âÖÖ´í211´Î
¡
nwrite=4096,errno=0
nwrite=-1, errno=11
âÖÖ´í698´Î
¡
nwrite=4096,errno=0
nwrite=-1, errno=11
âÖÖ´í604´Î
¡
nwrite=4096,errno=0
nwrite=-1, errno=11
âÖÖ´í1047´Î
¡
nwrite=-1, errno=11
âÖÖ´í1046´Î
¡
nwrite=4096,errno=0 ¡µÈµÈ
ÔÚ¸ÃϵͳÉÏ£¬errno11ÊÇEAGAIN¡£´ËϵͳÉϵÄÖÕ¶ËÇý¶¯³ÌÐò×ÜÊÇÒ»´Î½ÓÊÕ4096»ò81
92×Ö½Ú¡£ÔÚÁíÒ»¸öϵͳÉÏ£¬Ç°Èý¸öwrite·µ»Ø2005£¬1822ºÍ1811£¬È»ºóÊÇ96´Î³ö´í
·µ»Ø£¬½Ó×ÅÊÇ·µ»Ø1864µÈµÈ¡£
ÿ¸öwriteÄÜд¶àÉÙ×Ö½ÚÊÇÒÀÀµÓÚϵͳµÄ¡£
´Ë³ÌÐòÔÚSVRÖÐÔËÐУ¬ÔòÆä½á¹ûÍêÈ«²»Í¬ÓÚÇ°ÃæµÄÇé¿ö¡£µ±Êä³öµ½ÖÕ¶ËÉÏʱ£¬Êä³ö
¸ÃÕû¸öÊäÈëÎļþÖ»ÐèÒªÒ»¸öwrite¡£ÏÔÈ»£¬·Ç×èÈû·½Ê½²¢²»¹¹³ÉÇø±ð¡£´´½¨ÁËÒ»¸ö
½Ï´óµÄÊäÈëÎļþ£¬²¢ÇÒϵͳΪÔËÐиóÌÐòÔö¼ÓÁ˳ÌÐò»º´æ¡£³ÌÐòµÄÕâÖÖÔËÐз½Ê½£¨
¼´Êä³öÒ»Õû¸öÎļþ£¬Ö»µ÷ÓÃÒ»´Îwrite£©Ò»Ö±¼ÌÐøµ½ÊäÈëÎļþ³¤¶Èµ½´ïÔ¼700£¬000
×Ö½Ú¡£µ½´ï´Ë³¤¶Èºó£¬Ã¿Ò»¸öwrite¶¼·µ»Ø³ö´íEAGAIN¡££¨ÊäÈëÎļþÔò¾ö²»»áÔÙÊä
³öµ½ÖÕ¶ËÉÏ-¸Ã³ÌÐòÖ»ÊÇÁ¬ÐøµØ²úÉú³ö´íÏûÏ¢Á÷¡££©
ËùÒÔ·¢ÉúÕâÖÖÇé¿öÊÇÒòΪ£ºÔÚSVR4ÖÐÖÕ¶ËÇý¶¯³ÌÐòͨ¹ýÁ÷I/OϵͳÁ¬½Óµ½³ÌÐò¡££¨
12.4½Ú½«Ïêϸ˵Ã÷Á÷¡££©Á÷ϵͳÓÐËü×Ô¼ºµÄ»º´æ£¬ËüÒ»´ÎÄÜ´Ó³ÌÐò½ÓÊÕ¸ü¶àµÄÊý¾Ý
¡£SVR4µÄÐÐΪҲÒÀÀµÓÚÖÕ¶ËÀàÐÍ-Ó²Á¬ÏßÖÕ¶Ë¡¢¿ØÖÆÌ¨É豸»òαÖÕ¶Ë¡£
ÔÚ´ËʵÀýÖУ¬³ÌÐò·¢³öÁËÊýǧ¸öwriteµ÷Ó㬵«ÊÇÖ»ÓÐ20¸ö×óÓÒÊÇÕæÕýÊä³öÊý¾ÝµÄ
£¬ÆäÓàµÄÔò³ö´í·µ»Ø¡£ÕâÖÖÐÎʽµÄÑ»·³ÆÎªÂÖѯ£¬ÔÚ¶àÓû§ÏµÍ³ÉÏËüÀË·ÑÁËCPUʱ
¼ä¡£ÔÚ12.5½ÚÖУ¬ÎÒÃǽ«»á¿´µ½¶ÔÓÚ·Ç×èÈûÃèÊö·ûµÄI/O£¬¶à·ת½ÓÊǽøÐÐÕâÖÖ²Ù
×÷µÄ¸ü¼ÓÓÐЧµÄ·½·¨¡£
ÔÚµÚÊ®ÆßÕ£¬ÎÒÃǽ«»áÓõ½·Ç×èÈûI/O£¬ÄÇʱÎÒÃÇÒªÊä³öµ½ÖÕ¶ËÉ豸£¨PostScript
´òÓ¡»ú£©¶øÇÒ²»Ï£ÍûÔÚwriteÉÏ×èÈû¡£
12.3 ¼ÇÂ¼Ëø£¨Record Locking£©
µ±Á½¸öÈËͬʱ±à¼Ò»¸öÎļþʱ£¬Æäºó¹û½«ÈçºÎÄØ£¿ÔںܶàUnixϵͳÖУ¬¸ÃÎļþµÄ×î
ºó״̬ȡ¾öÓÚд¸ÃÎļþµÄ×îºóÒ»¸ö½ø³Ì¡£µ«ÊǶÔÓÚÓÐЩӦÓóÌÐò£¬ÀýÈçÊý¾Ý¿â£¬ÓÐ
ʱ½ø³ÌÐèҪȷ±£ËüÕýÔÚµ¥¶Àдһ¸öÎļþ¡£ÎªÁËÏò½ø³ÌÌṩÕâÖÖÄÜÁ¦£¬½ÏеÄUnixϵ
ͳÌṩÁ˼ÇÂ¼Ëø»úÖÆ¡££¨ÔÚµÚÊ®ÁùÕÂÖаüº¬ÁËʹÓüÇÂ¼ËøµÄÊý¾Ý¿â×Ó³ÌÐò¿â¡££©
¼ÇÂ¼Ëø»úÖÆµÄ¹¦ÄÜÊÇ£ºÒ»¸ö½ø³ÌÕýÔÚ¶Á»òÐÞ¸ÄÎļþµÄij¸ö²¿·Öʱ£¬¿ÉÒÔ×èÖ¹ÆäËü½ø
³ÌÐÞ¸ÄͬһÎļþÇø¡£¶ÔÓÚUnix£¬"¼Ç¼"Õâ¸ö¶¨ÓïÒ²ÊÇÎóÓã¬ÒòΪUnixϵͳºË¸ù±¾Ã»
ÓÐʹÓÃÎļþ¼Ç¼ÕâÖÖ¸ÅÄî¡£Ò»¸ö¸üÊʺϵÄÊõÓï¿ÉÄÜÊÇ"ÇøÓòËø"£¬ÒòΪËüËø¶¨µÄÖ»ÊÇ
ÎļþµÄÒ»¸öÇøÓò£¨Ò²¿ÉÄÜÊÇÕû¸öÎļþ£©¡£
ÀúÊ·
ͼ12.1¡¡¡¡Ê¾³öÁ˸÷ÖÖUnixϵͳÌṩµÄ²»Í¬ÐÎʽµÄ¼ÇÂ¼Ëø¡£
ͼ12.1¡¡¡¡¸÷ÖÖUnixϵͳ֧³ÖµÄ¼ÇÂ¼ËøÐÎʽ
ÔÚ±¾½ÚµÄ×îºó²¿·Ö½«ËµÃ÷½¨ÒéÐÔËøºÍÇ¿ÖÆÐÔËøÖ®¼äµÄÇø±ð¡£POSIX.1Ñ¡ÔñÁËÒÔfcnt
lº¯ÊýΪ»ù´¡µÄϵͳ£Ö·ç¸ñµÄ¼ÇÂ¼Ëø¡£ÕâÖÖ·ç¸ñÒ²µÃµ½£´.£³BSD¡¡Reno°æ±¾µÄÖ§³Ö
¡£
ÔçÆÚµÄ±´¿ËÀ³°æÖ»Ö§³ÖBSD flockº¯Êý¡£´Ëº¯ÊýÖ»ËøÕû¸öÎļþ£¬¶ø²»ËøÎļþÖеÄÒ»
¸öÇøÓò¡£µ«ÊÇPOSIX.1µÄfcntlº¯Êý¿ÉÒÔËøÎļþÖеÄÈÎÒ»ÇøÓò£¬´óÖÁÕû¸öÎļþ£¬Ð¡ÖÁ
µ¥¸ö×Ö½Ú¡£
ÔÚ±¾ÊéÖÐֻ˵Ã÷POSIX.1µÄfcntlËø¡£ÏµÍ³VµÄlockfº¯ÊýÖ»ÊÇfcntlº¯ÊýµÄÒ»¸ö½çÃæ
¡£
¼ÇÂ¼ËøÊÇ1980ÄêÓÉJohn Bass×îÔç¼Óµ½Version7Éϵġ£ÏµÍ³ºËÖÐÏàӦϵͳ
µ÷ÓÃÈë
¿Ú±íÏîÊÇÃûΪlockingµÄº¯Êý¡£´Ëº¯ÊýÌṩÁËÇ¿ÖÆÐÔ¼ÇÂ¼Ëø¹¦ÄÜ£¬Ëü´«µ½
Á˺ܶàÖÆ
ÔìÉ̵ÄϵͳIII°æ±¾¡£Xenixϵͳ²ÉÓÃÁ˴˺¯Êý£¬SVR4ÔÚXenix¼æÈÝ¿âÖÐÈÔ
¾ÉÖ§
³Ö¸Ãº¯Êý¡£
SVR2ÊÇϵͳVÖеÚÒ»¸öÖ§³Öfcntl·ç¸ñ¼ÇÂ¼ËøµÄ°æ±¾£¨1984£©¡£
fcntl¼ÇÂ¼Ëø
3.13½ÚÖÐÒѾ¸ø³öÁËfcntlº¯ÊýµÄÔÐÍ£¬ÎªÁËÐð˵·½±ã£¬ÕâÀïÔÙÖØ¸´Ò»´Î¡£
_______________________________________________________________________
________
#include <sys/types.h>
#include <unistd.h>
#include <fcnt1.h>
int fcnt1(int filedes,int cmd,¡/* struct flock *flockptr */);
·µ»Ø£ºÈô³É¹¦ÒÀÀµÓÚcmd£¨¼ûÏ£©£¬³
´íΪ-1
_______________________________________________________________________
________
¶ÔÓÚ¼ÇÂ¼Ëø£¬cmdÊÇF_GETLK¡¢F_SETLK»òF_SETLKW¡£µÚÈý¸ö²ÎÊý£¨ÎÒÃǽ«Æä³ÆÎªfl
ockptr£©ÊÇÒ»¸öÖ¸Ïòflock½á¹¹µÄÖ¸Õë¡£
Struct flock{
short l_type; /* F_RDLCK,F_WRLCK, »ò F_UNLCK */
off_t l_start; /*Ïà¶ÔÓÚl_whenceµÄ×Ö½ÚÎ»ÒÆÁ¿*/
short l_whence /SEEK_SET,SEEK_CUR,»òSEEK_END */
off_t l_len; /*³¤¶È£¨×Ö½Ú£©£¬O±íÊ¾ËøÖÁEOF */
pid_t l_pid; /*ËæF--FETLKÃüÁî·µ»Ø
}
flock½á¹¹ËµÃ÷£º
l ËùÏ£ÍûµÄËøÀàÐÍ£ºF_RDLCK£¨¹²Ïí¶ÁËø£©¡¢F_WRLCK£¨¶ÀÕ¼ÐÔÐ´Ëø£©¡¢»òF_UNLCK
£¨½âËøÒ»¸öÇøÓò£©
l Òª¼ÓËø»ò½âËøµÄÇøÓòµÄÆðʼµØÖ·£¬ËüÓÉl_stantºÍl__whenceÁ½Õß¾ö¶¨¡£l_statÊÇ
Ïà¶ÔÎ»ÒÆÁ¿£¨×Ö½Ú£©£¬l_whenceÔò¾ö¶¨ÁËÏà¶ÔÎ»ÒÆÁ¿µÄÆðµã¡£ÕâÓëlseekÖеÄʹÓÃ
·½·¨Ò»Ñù¡£
l ÇøÓòµÄ³¤¶È£¬ÕâÓÉl_len±íʾ¡£
¹ØÓÚ¼ÓËøºÍ½âËøÇøÓòµÄ˵Ã÷»¹Òª×¢ÒâÏÂÁи÷µã£º
l ¸ÃÇøÓò¿ÉÒÔÔÚµ±Ç°Îļþβ¶Ë´¦¿ªÊ¼»ò³¬¹ýÆäβ¶Ë´¦¿ªÊ¼£¬µ«ÊDz»ÄÜÔÚÎļþÆðʼλ
ÖÃ֮ǰ¿ªÊ¼»òÔ½¹ý¸ÃÆðʼλÖá£
l ÈçÈôl_lenΪ0£¬Ôò±íÊ¾ËøµÄÇøÓò´ÓÆäÆðµã£¨ÓÉl_startºÍl_whence¾ö¶¨£©¿ªÊ¼Ö±
ÖÁ×î´ó¿ÉÄÜλÖÃΪֹ¡£Ò²¾ÍÊDz»¹ÜÌíдµ½¸ÃÎļþÖжàÉÙÊý¾Ý£¬Ëü¶¼´¦ÓÚËøµÄ·¶Î§¡£
l ΪÁËËøÕû¸öÎļþ£¬Í¨³£µÄ·½·¨Êǽ«l_start˵Ã÷Ϊ0£¬l_whence˵Ã÷ΪSEEK_SET£¬
l_len˵Ã÷Ϊ0¡£
ÉÏÃæÌáµ½ÁËÁ½¸öËøÀàÐÍ£º¹²Ïí¶ÁËø£¨l_typeΪF_RDLCK£©ºÍ¶ÀռдËö£¨F_WRLCK£©¡£
»ù±¾¹æÔòÊÇ£º¶à¸ö½ø³ÌÔÚÒ»¸ö¸ø¶¨µÄ×Ö½ÚÉÏ¿ÉÒÔÓÐÒ»°Ñ¹²ÏíµÄ¶ÁËø£¬µ«ÊÇÔÚÒ»¸ö¸ø
¶¨×Ö½ÚÉϵÄÐ´ËøÔòÖ»ÄÜÓÉÒ»¸ö½ø³Ì¶ÀÓ᣸ü½øÒ»²½¶øÑÔ£¬Èç¹ûÔÚÒ»¸ö¸ø¶¨¼Ó×Ö½ÚÉÏ
ÒѾÓÐÒ»°Ñ»ò¶à°Ñ¶ÁËø£¬Ôò²»ÄÜÔÚ¸Ã×Ö½ÚÉÏÔÙ¼ÓÐ´Ëø£»Èç¹ûÔÚÒ»¸ö×Ö½ÚÉÏÒѾÓÐÒ»
°Ñ¶ÀÕ¼ÐÔµÄÐ´Ëø£¬Ôò²»ÄÜÔÙ¶ÔËü¼ÓÈκζÁËø¡£ÔÚͼ12.2ÖÐʾ³öÁËÕâЩ¹æÔò¡£
ͼ12.2 ²»Í¬ÀàÐÍËøÖ®¼äµÄ¼æÈÝÐÔ
ΪÁ˼ӶÁËø£¬¸ÃÃèÊö·û±ØÐëÊǶÁ´ò¿ª£¬ÎªÁ˼ÓÐ´Ëø£¬¸ÃÃèÊö·û±ØÐëÊÇд´ò¿ª¡£
ÏÖÔÚ˵Ã÷fcntlº¯ÊýµÄÈýÖÖÃüÁî¡£
F_GETLK ¾ö¶¨ÓÉflockptrËù˵Ã÷µÄËøÊÇ·ñ±»ÁíÍâÒ»°ÑËøËùÅų⣨×èÈû£©¡£Èç
¹û´æÔÚÒ»°ÑËø£¬Ëü×èÖ¹´´½¨ÓÉflockptrËùÃèÊö·ûµÄËø£¬ÔòÕâ°ÑÏÖ´æµÄËøµÄÐÅϢдµ½
flockptrÖ¸ÏòµÄ½á¹¹ÖУ»Èç¹û²»´æÔÚÕâÖÖÇé¿ö£¬Ôò³ýl_typeÉèÖÃΪF_UNLCKÖ®Í⣬
flockptrËùÖ¸Ïò½á¹¹ÖÐµÄÆäËüÐÅÏ¢¡¢±£³Ö²»±ä¡£
F_SETLK ÉèÖÃÓÉflockptrËùÃèÊöµÄËø¡£Èç¹ûÊÔͼ½¨Á¢Ò»°Ñ°´ÉÏÊö¼æÈÝÐÔ¹æÔò
²¢²»ÔÊÐíµÄËø£¬ÔòfcntlÁ¢¼´³ö´í·µ»Ø£¬´ËʱerrnoÉèÖÃΪEACCES»òEAGAIN¡£
SVR2ºÍSVR4·µ»ØEACCES£¬µ«ÊÖ²áÒ³¾¯¸æ½«À´·µ»ØEAGAIN¡£4.3+BS
DÔò·µ»ØEAGAIN¡£POSIX.1ÔÊÐíÕâÁ½ÖÖÇé¿ö¡£
´ËÃüÁîÒ²ÓÃÀ´Çå³ýÓÉflockptr˵Ã÷µÄËø£¨l_typeΪF_UNLCK£©¡£
F_SETLKW ÕâÊÇF_SETLKµÄ×èÈû°æ±¾£¨ÃüÁîÃûÖеÄW±íʾµÈ´ý£¨wait£©£©¡£Èç¹û
ÓÉÓÚ´æÔÚÆäËüËø£¬ÄÇô°´¼æÈÝÐÔ¹æÔòÓÉflockptrËùÒªÇóµÄËø²»Äܱ»´´½¨£¬Ôòµ÷Óýø
³Ì˯Ãß¡£Èç¹û²¶×½µ½ÐźÅÔò˯ÃßÖжϡ£
Ó¦µ±Á˽⣬ÓÃF_GETLK²âÊÔÄÜ·ñ½¨Á¢Ò»°ÑËø£¬È»ºóÓÃF_SETLKºÍF_SETLKWÆóͼ½¨Á¢Ò»
°ÑËø£¬ÕâÁ½Õß²»ÊÇÒ»¸öÔ×Ó²Ù×÷¡£ÔÚÕâÁ½¸ö²Ù×÷Ö®¼ä¿ÉÄÜ»áÓÐÁíÒ»¸ö½ø³Ì²åÈë²¢½¨
Á¢Ò»°ÑÏà¹ØµÄËø£¬Ê¹ÔÀ´²âÊÔµ½µÄÇé¿ö·¢Éú±ä»¯£¬Èç¹û²»Ï£ÍûÔÚ½¨Á¢ËøÊ±¿ÉÄܲúÉú
µÄ³¤ÆÚ×èÈû£¬ÔòӦʹÓÃF_SETLK£¬²¢¶Ô·µ»Ø½á¹û½øÐвâÊÔ£¬ÒÔÅбðÊÇ·ñ³É¹¦µØ½¨Á¢
ÁËËùÒªÇóµÄËø¡£
ÔÚÉèÖûòÊÍ·ÅÔÚÒ»¸öÎļþÉϵÄÒ»°ÑËøÊ±¡£ÏµÍ³°´Ðè×éºÏ»òÁÑ¿ªÏàÁÚÇø¡£ÀýÈçÈô100
-199×Ö½ÚÊǼÓËøµÄÇø£¬È»ºó½âËøµÚ150×Ö½Ú£¬ÔòϵͳºË½«Î¬³ÖÁ½°ÑËø£¬Ò»°ÑÊÇ´Ó10
0-149×Ö½Ú£¬ÁíÒ»°ÑÊÇ´Ó151-199×Ö½Ú¡£
ʵÀý-ÒªÇóºÍÊÍ·ÅÒ»°ÑËø
ΪÁËÃâÓÚÿ´Î·ÖÅäflock½á¹¹£¬È»ºóÓÖÌîÈë¸÷ÏîÐÅÏ¢£¬¿ÉÒÔÓóÌÐò12.2Öеĺ¯Êýlo
ck_regÀ´´¦ÀíÕâЩϸ½Ú¡£
#include <sys/types.h>
#include <fcntl.h>
#include "ourhdr.h"
int
lock_reg(int fd, int cmd, int type, off_t offset, int whence, off_t len
)
{
struct flock lock;
lock.l_type = type; /* F_RDLCK, F_WRLCK, F_UNLCK */
lock.l_start = offset; /* byte offset, relative to l_whence */
lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */
lock.l_len = len; /* #bytes (0 means to EOF) */
return( fcntl(fd, cmd, &lock) );
}
³ÌÐò12.2 ËøºÍ½âËøÒ»¸öÎļþÇøÓòµÄº¯Êý
ÒòΪ´ó¶àÊýËøµ÷ÓÃÊÇËø»ò½âËøÒ»¸öÎļþÇøÓò£¨ÃüÁîF_GETLKºÜÉÙʹÓã©¡£ÎÒÃÇͨ³£
ʹÓÃÏÂÁÐÎå¸öºê£¬ËüÃǶ¼¶¨ÒåÔÚourhdr.hÖУ¨¸½Â¼B£©¡£
#define read_lock(fd,offset,whence,len)
lock_reg(fd,F_SETLK,F_RDLCK,offset,whence,len)
#define needw_lock(fd,offset,whence,len)
lock_reg(fd,F_SETLKW,F_RDLCK,offset,whence,len)
#define write_lock(fd,offset,whence,len)
lock_reg(fd,F_SETLK,F_WRLCK,offset,whence,len)
#define writew_lock(fd,offset,whence,len)
lock_reg(fd,F_SETLKW,F_WRLCK,offset,whence,len)
#define un_lock(fd,offset,whence,len)
lock_reg(fd,F_SETLK,F_UNLCK,offset,whence,len)
ÎÒÃÇÒÔlseekº¯ÊýÖеÄͬÑù˳Ðò¶¨ÒåÁËÕâЩºêÖеÄÈý¸ö²ÎÊý¡£
ʵÀý-²âÊÔÒ»°ÑËø
³ÌÐò12.3¶¨ÒåÁËÒ»¸öº¯Êýlock_test£¬¿ÉÓÃÆä²âÊÔÒ»°ÑËø¡£
#include <sys/types.h>
#include <fcntl.h>
#include "ourhdr.h"
pid_t
lock_test(int fd, int type, off_t offset, int whence, off_t len)
{
struct flock lock;
lock.l_type = type; /* F_RDLCK or F_WRLCK */
lock.l_start = offset; /* byte offset, relative to l_whence */
lock.l_whence = whence; /* SEEK_SET, SEEK_CUR, SEEK_END */
lock.l_len = len; /* #bytes (0 means to EOF) */
if (fcntl(fd, F_GETLK, &lock) < 0)
err_sys("fcntl error");
if (lock.l_type == F_UNLCK)
return(0); /* false, region is not locked by anothe
proc */
return(lock.l_pid); /* true, return pid of lock owner */
}
³ÌÐò12.3 ²âÊÔÒ»¸öËøÌõ¼þµÄº¯Êý
Èç¹û´æÔÚÒ»°ÑËø£¬Ëü×èÈûÓɲÎÊý˵Ã÷µÄËø£¬Ôò´Ëº¯Êý·µ»Ø³ÖÓÐÕâ°ÑÏÖ´æËøµÄ½ø³ÌµÄ
ID£¬·ñÔò´Ëº¯Êý·µ»Ø0¡£Í¨³£ÓÃÏÂÃæÁ½¸öºêÀ´µ÷Óô˺¯Êý£¨ËüÃÇÒ²¶¨ÒåÔÚourhdr.h
£©¡£
#define is_read_lockable(fd,offset,whence,len)
lock_test(fd,F_RDLCK,offset,whence,len)
#define is_write_lockable(fd,offset,whence,len)
lock_test(fd,F_WRLCK,offset,whence,len)
ʵÀý-ËÀËø
Èç¹ûÁ½¸ö½ø³ÌÏ໥µÈ´ý¶Ô·½³ÖÓв¢ÇÒ²»ÊÍ·Å£¨Ëø¶¨£©µÄ×ÊԴʱ£¬ÔòÕâÁ½¸ö½ø³Ì¾Í´¦
ÓÚËÀËø×´Ì¬¡£Èç¹ûÒ»¸ö½ø³ÌÒѾ¿ØÖÆÁËÒ»¸öÎļþÖеÄÒ»¸ö¼ÓËøÇøÓò£¬È»ºóËüÓÖÊÔͼ
¶ÔÁíÒ»¸ö½ø³Ì¿ØÖƵÄÇøÓò¼ÓËø£¬ÔòËü¾Í»á˯Ãߣ¬ÔÚÕâÖÖÇé¿öÏ£¬Óз¢ÉúËÀËøµÄ¿ÉÄÜ
ÐÔ¡£
³ÌÐò12.4ʾ³öÁËÒ»¸öËÀËøµÄÀý×Ó¡£×Ó½ø³ÌËø×Ö½Ú0£¬¸¸½ø³ÌËø×Ö½Ú1¡£È»ºó£¬ËüÃÇÖÐ
µÄÿһ¸öÓÖÊÔÍ¼Ëø¶Ô·½ÒѾ¼ÓÁËËøµÄ×Ö½Ú¡£ÔڸóÌÐòÖÐʹÓÃÁË8.8½ÚÖнéÉܵĸ¸-×Ó
½ø³Ìͬ²½Àý³Ì£¨TELL_xxx£¬WAIT_xxx£©,ʹµÃ¶Ô·½¶¼Äܽ¨Á¢µÚÒ»°ÑËø¡£ÔËÐгÌÐò12
.4µÃµ½£º
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "ourhdr.h"
static void lockabyte(const char *, int, off_t);
int
main(void)
{
int fd;
pid_t pid;
/* Create a file and write two bytes to it */
if ( (fd = creat("templock", FILE_MODE)) < 0)
err_sys("creat error");
if (write(fd, "ab", 2) != 2)
err_sys("write error");
TELL_WAIT();
if ( (pid = fork()) < 0)
err_sys("fork error");
else if (pid == 0) { /* child */
lockabyte("child", fd, 0);
TELL_PARENT(getppid());
WAIT_PARENT();
lockabyte("child", fd, 1);
} else { /* parent */
lockabyte("parent", fd, 1);
TELL_CHILD(pid);
WAIT_CHILD();
lockabyte("parent", fd, 0);
}
exit(0);
}
static void
lockabyte(const char *name, int fd, off_t offset)
{
if (writew_lock(fd, offset, SEEK_SET, 1) < 0)
err_sys("%s: writew_lock error", name);
printf("%s: got the lock, byte %d\n", name, offset);
}
³ÌÐò12.4 ËÀËø¼ì²âʵÀý
$ a.out
child:got the lock,byte 0
parent:got the lock,byte 1
child:writew_lock error:Deadlock situation detected/avoided
parent:got the lock,byte 0
¼ì²âµ½ËÀËøÊ±£¬ÏµÍ³ºË±ØÐëÑ¡ÔñÒ»¸ö½ø³ÌÊÕµ½³ö´í·µ»Ø¡£ÔÚ±¾ÊµÀýÖУ¬Ñ¡ÔñÁË×Ó½ø
³Ì£¬ÕâÊÇÒ»¸öʵÏÖϸ½Ú¡£µ±´Ë³ÌÐòÔÚÁíÒ»¸öϵͳÉÏÔËÐÐʱ£¬Ò»°ë´ÎÊýÊÇ×Ó½ø³Ì½Óµ½
³ö´íÐÅÏ¢£¬ÁíÒ»°ëÔòÊǸ¸½ø³Ì¡£
ËøµÄÒþº¬¼Ì³ÐºÍÊÍ·Å
¹ØÓÚ¼ÇÂ¼ËøµÄ×Ô¶¯¼Ì³ÐºÍÊÍ·ÅÓÐÈýÌõ¹æÔò£º
1. ËøÓëÒ»¸ö½ø³Ì¡¢Ò»¸öÎļþÁ½·½ÃæÓйء£ÕâÓÐÁ½Öغ¬Òâ¡£µÚÒ»ÖØÊǺÜÃ÷ÏԵ쬵±
Ò»¸ö½ø³ÌÖÕֹʱ£¬ËüËù½¨Á¢µÄËøÈ«²¿ÊÍ·Å¡£µÚ¶þÖØÒâ˼¾Í²»ºÜÃ÷ÏÔ£¬ÈκÎʱºò¹Ø±Õ
Ò»¸öÃèÊö·ûʱ£¬Ôò¸Ã½ø³Ìͨ¹ýÕâÒ»ÃèÊö·û¿ÉÒÔ´æ·ÃµÄÎļþÉϵÄÈκÎÒ»°ÑËø¶¼±»ÊÍ·Å
£¨ÕâÐ©Ëø¶¼ÊǸýø³ÌÉèÖõģ©¡£Õâ¾ÍÒâζ×ÅÈç¹ûÖ´ÐÐÏÂÁÐËIJ½£º
fd1=open(pathname,¡);
read_lock(fd1,¡);
fd2=dup(fd1);
close(fd2);
ÔòÔÚclose£¨fd2£©ºó£¬ÔÚfd1ÉÏÉèÖõÄËø±»ÊÍ·Å¡£Èç¹û½«dup´ú»»Îªopen
£¬ÆäЧ¹ûÒ²Ò»Ñù£º
fd1=open(palhname,¡);
read_lock(fd1,¡);
fd2=open(palhname,¡);
close(fd2);
2. ÓÉfork²úÉúµÄ×Ó³ÌÐò²»¼Ì³Ð¸¸½ø³ÌËùÉèÖõÄËø¡£ÕâÒâζ×Å£¬ÈôÒ»¸ö½ø³ÌµÃµ½Ò»
°ÑËø£¬È»ºóµ÷ÓÃfork£¬ÄÇô¶ÔÓÚ¸¸½ø³Ì»ñµÃµÄËø¶øÑÔ£¬×Ó½ø³Ì±»ÊÓΪÁíÒ»¸ö½ø³Ì£¬
¶ÔÓÚ´Ó¸¸½ø³Ì´¦¼Ì³Ð¹ýÀ´µÄÈÎÒ»ÃèÊö·û£¬×Ó½ø³ÌÒªµ÷ÓÃfcntlÒÔ»ñµÃËü×Ô¼ºµÄËø¡£
ÕâÓëËøµÄ×÷ÓÃÊÇÏàÒ»Öµġ£ËøµÄ×÷ÓÃÊÇ×èÖ¹¶à¸ö½ø³Ìͬʱдͬһ¸öÎļþ£¨»òͬһÎÄ
¼þÇøÓò£©¡£Èç¹û×Ó½ø³Ì¼Ì³Ð¸¸½ø³ÌµÄËø£¬Ôò¸¸¡¢×Ó½ø³Ì¾Í¿ÉÒÔͬʱдͬһ¸öÎļþ¡£
3. ÔÚÖ´ÐÐexecºó£¬Ð³ÌÐò¿ÉÒԼ̳ÐÔÖ´ÐгÌÐòµÄËø¡£
POSIX.1ûÓÐÒªÇóÕâÒ»µã¡£µ«ÊÇ£¬SVR4ºÍ4.3+BSD¶¼Ö§³ÖÕâÒ»µã
4.3+BSDµÄʵÏÖ
ÏȼòÒªµØ¹Û²ì4.3+BSDʵÏÖÖÐʹÓõÄÊý¾Ý½á¹¹£¬´ÓÖпÉÒÔ¿´µ½ËøÊÇÓëÒ»¸ö½ø³Ì¡¢Ò»
¸öÎļþÏà¹ØÁªµÄ¡£
¿¼ÂÇÒ»¸ö½ø³Ì£¬ËüÖ´ÐÐÏÂÁÐÓï¾ä£¨ºöÂÔ³ö´í·µ»Ø£©£º
fd1 = open(pathname, ¡ );
write_lock(fd1, 0, SEEK_SET, 1); ¸¸½ø³ÌÔÚ×Ö½Ú0дË
if (fork() > 0) {
fd2 = dup(fdl);
fd3 = open(pathname, ¡);
pause;
} else {
read_lock(fd1, 1, SEEK_SET, 1); ×Ó½ø³ÌÔÚ×Ö½Ú1¶ÁË
pause;
}
ͼ12.3 ÏÔʾÁ˸¸¡¢×Ó½ø³ÌÔÝÍ££¨Ö´ÐÐpause( )£©ºóµÄÊý¾Ý½á¹¹Çé¿ö¡£
ͼ12.3 ¹ØÓÚ¼ÇÂ¼ËøµÄ4.3+BSDÊý¾Ý½á¹¹
ÔÚÒÔǰµÄͼ3.4ºÍ8.1ÖÐÒÑÏÔʾÁËopen¡¢forkÒÔ¼°dupºóµÄÊý¾Ý½á¹¹ÓÐÁ˼ÇÂ¼Ëøºó£¬
ÔÚÔÀ´µÄÕâЩͼÉÏмÓÁËflock½á¹¹£¬ËüÃÇÓÉi_node½á¹¹¿ªÊ¼Ï໥Á¬½ÓÆðÀ´¡£×¢Òâ
£¬Ã¿¸öflock½á¹¹ËµÃ÷ÁËÒ»¸ö¸ø¶¨½ø³ÌµÄÒ»¸ö¼ÓËøÇøÓò¡£ÔÚͼÖÐÏÔʾÁËÁ½¸öflock½á
¹¹£¬Ò»¸öÊÇÓɸ¸½ø³Ìµ÷ÓÃwrite_lockÐγɵģ¬ÁíÒ»¸öÔòÓÉ×Ó½ø³Ìµ÷ÓÃread_lockÐÎ
³ÉµÄ¡£Ã¿Ò»¸ö½á¹¹¶¼°üº¬ÁËÏàÓ¦½ø³ÌID¡£
ÔÚ¸¸½ø³ÌÖУ¬¹Ø±Õfd1¡¢fd2ºÍfd3ÖеÄÈκÎÒ»¸ö¶¼ÊÍ·ÅÓɸ¸½ø³ÌÉèÖõÄÐ´Ëø¡£ÔÚ¹Ø
±ÕÕâÈý¸öÃèÊö·ûÖеÄÈκÎÒ»¸öʱ£¬ÏµÍ³ºË»á´Ó¸ÃÃèÊö·ûËù¹ØÁ¬µÄi_node¿ªÊ¼£¬Öð¸ö
¼ì²éflockÁ¬½Ó±íÖи÷ÏÊÍ·ÅÓɵ÷Óýø³Ì³ÖÓеĸ÷°ÑËø¡£ÏµÍ³ºË²¢²»Çå³þÒ²²»¹Ø
Ðĸ¸½ø³ÌÊÇÓÃÄÄÒ»¸öÃèÊö·ûÀ´ÉèÖÃÕâ°ÑËøµÄ¡£
ʵÀý£º
½¨ÒéÐÔËø¿ÉÓɾ«Áé½ø³ÌʹÓÃÒÔ±£Ö¤¸Ã¾«Áé½ø³ÌÖ»ÓÐÒ»¸ö¸±±¾ÔÚÔËÐС£ÔÚÆð¶¯Ê±£¬ºÜ
¶à¾«Áé½ø³Ì¶¼°ÑËüÃǵĽø³ÌIDдµ½Ò»¸öËüÃǸ÷×ÔרÓõÄÒ»¸öPIDÎļþÉÏ¡£µ±ÏµÍ³Í£
»úʱ£¬¿ÉÒÔ´ÓÕâЩÎļþÖÐÈ¡ÓÃÕâЩ¾«Áé½ø³ÌµÄ½ø³ÌID¡£·ÀÖ¹Ò»¸ö¾«Áé½ø³ÌÓжà·Ý¸±
±¾Í¬Ê±ÔËÐеķ½·¨ÊÇ£ºÔÚ¾«Áé½ø³Ì¿ªÊ¼ÔËÐÐʱ£¬ÔÚËüµÄ½ø³ÌIDÎļþÉÏÆóͼÉèÖÃÒ»°Ñ
Ð´Ëø¡£Èç¹ûÔÚËüÔËÐÐʱһֱ±£³ÖÕâ°ÑËø£¬Ôò¾Í²»¿ÉÄÜÔÙÆð¶¯ËüµÄÆäËü¸±±¾¡£³ÌÐò1
2.5ʵÏÖÁËÕâÒ»¼¼Êõ¡£
ÒòΪ½ø³ÌIDÎļþ¿ÉÄܰüº¬ÒÔǰµÄ¾«Áé½ø³ÌID£¬¶øÇÒÆä³¤¶È»¹¿ÉÄܳ¤ÓÚµ±Ç°½ø³ÌµÄI
D£¬ÀýÈç¸ÃÎļþÖÐÒÔǰµÄÄÚÈÝ¿ÉÄÜÊÇ12345\n£¬¶øÏÖÔڵĽø³ÌIDÊÇ654£¬ÎÒÃÇÏ£Íû¸Ã
ÎļþÏÖÔÚÖ»°üº¬654\n£¬¶ø²»ÊÇ654\n5£¬ËùÒÔÔÚд¸ÃÎļþʱ£¬ÏȽ«Æä½Ø¶ÌΪ0¡£×¢Òâ
£¬ÒªÔÚÉèÖÃÁËËøÖ®ºóÔÙµ÷ÓýضÌÎļþ³¤¶ÈµÄº¯Êýftruncate¡£ÔÚµ÷ÓÃopenʱ²»ÄÜÖ¸
¶¨O_TRUNC£¬ÒòΪÕâÑù×ö»áÔÚÓÐÒ»¸öÕâÖÖ¾«Áé½ø³ÌÔËÐв¢¶Ô¸ÃÎļþ¼ÓÁËËøÊ±Ò²»áʹ
¸ÃÎļþ½Ø¶ÌΪ0¡££¨Èç¹ûʹÓÃÇ¿ÖÆÐÔËø¶ø²»Êǽ¨ÒéÐÔËø£¬Ôò¿ÉʹÓÃO_TRUNC¡£ÔÚ±¾½Ú
×îºó²¿·Ö½«ÌÖÂÛÇ¿ÖÆÐÔËø¡££©
ÔÚ±¾ÊµÀýÖУ¬Ò²¶Ô¸ÃÃèÊö·ûÉèÖÃexecʱ¹Ø±Õ£¨close-on-exec£©±êÖ¾¡£ÕâÊÇÒòΪ¾«
Áé½ø³Ì³£³£fork²¢execÆäËü½ø³Ì£¬ÎÞÐèÔÚÁíÒ»¸ö½ø³ÌÖÐʹ¸ÃÎļþÒ²´¦ÔÚ´ò¿ª×´Ì¬¡£
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include "ourhdr.h"
#define PIDFILE "daemon.pid"
int
main(void)
{
int fd, val;
char buf[10];
if ( (fd = open(PIDFILE, O_WRONLY | O_CREAT, FILE_MODE)) < 0)
err_sys("open error");
/* try and set a write lock on the entire file */
if (write_lock(fd, 0, SEEK_SET, 0) < 0) {
if (errno == EACCES || errno == EAGAIN)
exit(0); /* gracefully exit, daemon is already ru
ning */
else
err_sys("write_lock error");
}
/* truncate to zero length, now that we have the lock */
if (ftruncate(fd, 0) < 0)
err_sys("ftruncate error");
/* and write our process ID */
sprintf(buf, "%d\n", getpid());
if (write(fd, buf, strlen(buf)) != strlen(buf))
err_sys("write error");
/* set close-on-exec flag for descriptor */
if ( (val = fcntl(fd, F_GETFD, 0)) < 0)
err_sys("fcntl F_GETFD error");
val |= FD_CLOEXEC;
if (fcntl(fd, F_SETFD, val) < 0)
err_sys("fcntl F_SETFD error");
/* leave file open until we terminate: lock will be held */
/* do whatever ... */
exit(0);
}
³ÌÐò12.5 ¾«Áé½ø³Ì×èÖ¹Æä¶à·Ý¸±±¾Í¬Ê±ÔËÐÐµÄÆð¶¯´úÂë
ʵÀý
ÔÚÏà¶ÔÎļþβ¶Ë¼ÓËø»ò½âËøÊ±ÐèÒªÌØ±ðСÐÄ¡£´ó¶àÊýʵÏÖ°´ÕÕI_whenceµÄSEEK_CU
R»òSEEN_ENDÖµ£¬ÓÃÎļþµ±Ç°Î»Öûòµ±Ç°³¤¶ÈÒÔ¼°l_startµÃµ½¾ø¶ÔµÄÎļþÎ»ÒÆÁ¿¡£
µ«ÊÇ£¬Í¨³£ÎÒÃÇÐèÒªÏà¶ÔÓÚÎļþµÄµ±Ç°Î»Öûòµ±Ç°³¤¶ÈÖ¸¶¨Ò»°ÑËø¡£
³ÌÐò12.6дһ¸öÎļþ,Ò»´ÎÒ»¸ö×Ö½Ú¡£Ã¿´ÎÑ»·ÖÐ,´ÓÎļþµ±Ç°Î²¶Ë¿ªÊ¼´¦¼ÓËøÖ±µ½
½«À´¿ÉÄÜÀ©³äµ½µÄβ¶ËΪֹ£¨×îºóÒ»¸ö²ÎÊý£¬³¤¶È£¬Ö¸¶¨Îª0£©£¬È»ºóд1¸ö×Ö½Ú¡£
È»ºó½â³ýÕâ°ÑËø£¬Ð´ÁíÒ»¸ö×Ö½Ú¡£Èç¹ûϵͳÓÃ"´Óµ±Ç°Î²¶Ë¿ªÊ¼£¬Ö±µ½½«À´¿ÉÄÜÀ©
³äµÄβ¶Ë"ÕâÖּǷ¨À´¸ú×ÙËø£¬ÄÇôÕâ¶Î³ÌÐòÄܹ»Õý³£¹¤×÷¡£µ«ÊÇÈç¹ûϵͳ½«Ïà¶Ô
Î»ÒÆÁ¿±ä»»³É¾ø¶ÔÎ»ÒÆÁ¿¾Í»áÓÐÎÊÌâ¡£ÔÚSVR4ÖÐÔËÐд˳ÌÐòµÄÈ·»á·¢ÉúÎÊÌ⣺
#include <sys/types.h>
#include <sys/stat.h>
/* set close-on-exec flag for descriptor */
if ( (val = fcntl(fd, F_GETFD, 0)) < 0)
err_sys("fcntl F_GETFD error");
val |= FD_CLOEXEC;
if (fcntl(fd, F_SETFD, val) < 0)
err_sys("fcntl F_SETFD error");
/* leave file open until we terminate: lock will be held */
/* do whatever ... */
exit(0);
}
³ÌÐò12.5 ¾«Áé½ø³Ì×èÖ¹Æä¶à·Ý¸±±¾Í¬Ê±ÔËÐÐµÄÆð¶¯´úÂë
ʵÀý
ÔÚÏà¶ÔÎļþβ¶Ë¼ÓËø»ò½âËøÊ±ÐèÒªÌØ±ðСÐÄ¡£´ó¶àÊýʵÏÖ°´ÕÕI_whenceµÄSEEK_CU
R»òSEEN_ENDÖµ£¬ÓÃÎļþµ±Ç°Î»Öûòµ±Ç°³¤¶ÈÒÔ¼°l_startµÃµ½¾ø¶ÔµÄÎļþÎ»ÒÆÁ¿¡£
µ«ÊÇ£¬Í¨³£ÎÒÃÇÐèÒªÏà¶ÔÓÚÎļþµÄµ±Ç°Î»Öûòµ±Ç°³¤¶ÈÖ¸¶¨Ò»°ÑËø¡£
³ÌÐò12.6дһ¸öÎļþ,Ò»´ÎÒ»¸ö×Ö½Ú¡£Ã¿´ÎÑ»·ÖÐ,´ÓÎļþµ±Ç°Î²¶Ë¿ªÊ¼´¦¼ÓËøÖ±µ½
½«À´¿ÉÄÜÀ©³äµ½µÄβ¶ËΪֹ£¨×îºóÒ»¸ö²ÎÊý£¬³¤¶È£¬Ö¸¶¨Îª0£©£¬È»ºóд1¸ö×Ö½Ú¡£
È»ºó½â³ýÕâ°ÑËø£¬Ð´ÁíÒ»¸ö×Ö½Ú¡£Èç¹ûϵͳÓÃ"´Óµ±Ç°Î²¶Ë¿ªÊ¼£¬Ö±µ½½«À´¿ÉÄÜÀ©
³äµÄβ¶Ë"ÕâÖּǷ¨À´¸ú×ÙËø£¬ÄÇôÕâ¶Î³ÌÐòÄܹ»Õý³£¹¤×÷¡£µ«ÊÇÈç¹ûϵͳ½«Ïà¶Ô
Î»ÒÆÁ¿±ä»»³É¾ø¶ÔÎ»ÒÆÁ¿¾Í»áÓÐÎÊÌâ¡£ÔÚSVR4ÖÐÔËÐд˳ÌÐòµÄÈ·»á·¢ÉúÎÊÌ⣺
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "ourhdr.h"
int
main(void)
{
int i, fd;
if ( (fd = open("temp.lock", O_RDWR | O_CREAT | O_TRUNC,
FILE_MODE)) < 0)
err_sys("open error");
for (i = 0; i < 1000000; i++) { /* try to write 2 Mbytes */
/* lock from current EOF to EOF */
if (writew_lock(fd, 0, SEEK_END, 0) < 0)
err_sys("writew_lock error");
if (write(fd, &fd, 1) != 1)
err_sys("write error");
if (un_lock(fd, 0, SEEK_END, 0) < 0)
err_sys("un_lock error");
if (write(fd, &fd, 1) != 1)
err_sys("write error");
}
exit(0);
¸³Óël_start£©¸Ä»»³ÉËùд×Ö½ÚÊýµÄ¸ºÖµ£¨ÔÚ±¾³ÌÐòÖÐÊÇ-1£©¡£Õâ¾ÍʹµÃun_lockÈ¥
³ýÉϴμӵÄËø¡£
½¨ÒéÐÔËøºÍÇ¿ÖÆÐÔËø
¿¼ÂÇÊý¾Ý¿â´æÈ¡Àý³ÌÐò¡£Èç¹û¸Ã¿âÖÐËùÓк¯Êý¶¼ÒÔÒ»Öµķ½·¨´¦Àí¼ÇÂ¼Ëø£¬ÔòÎÒÃÇ
³ÆÊ¹ÓÃÕâЩº¯Êý´æÈ¡Êý¾Ý¿âµÄÈκνø³Ì¼¯ÎªºÏ×÷½ø³Ì¡£Èç¹ûÕâЩº¯ÊýÊÇΨһµÄÓÃÀ´
´æÈ¡Êý¾Ý¿âµÄº¯Êý£¬ÄÇôËüÃÇʹÓý¨ÒéÐÔËøÊÇ¿ÉÐеġ£µ«Êǽ¨ÒéÐÔËø²¢²»ÄÜ×èÖ¹¶Ô
Êý¾Ý¿âÎļþÓÐдÐí¿ÉȨµÄÈÎºÎÆäËü½ø³ÌдÊý¾Ý¿âÎļþ¡£²»Ê¹ÓÃÐͬһÖµķ½·¨£¨Êý
¾Ý¿â´æÈ¡Àý³Ì¿â£©À´´æÈ¡Êý¾Ý¿âµÄ½ø³ÌÊÇÒ»¸ö·ÇºÏ×÷½ø³Ì¡£
Ç¿ÖÆÐÔËø»úÖÆÖУ¬ÏµÍ³ºË¶Ôÿһ¸öopen¡¢readºÍwrite¶¼Òª¼ì²éµ÷Óýø³Ì¶ÔÕýÔÚ´æ
È¡µÄÎļþÊÇ·ñÎ¥±³ÁËijһ°ÑËøµÄ×÷Óá£
¶ÔÒ»¸öÌØ¶¨Îļþ´ò¿ªÆäÉèÖÃ_×é_ID룬¹Ø±ÕÆä×é_Ö´ÐÐλÔò¶Ô¸ÃÎļþÆô¶¯ÁËÇ¿ÖÆÐÔ
Ëø»úÖÆ¡££¨»ØÒä³ÌÐò4.4£©¡£ÒòΪµ±×é_ Ö´ÐÐλ¹Ø±Õʱ£¬ÉèÖÃ_×é_IDλ²»ÔÙÓÐÒâÒå
£¬ËùÒÔSVR3µÄÉè¼ÆÕß½èÓÃÁ½ÕßµÄÕâÖÖ×éºÏÀ´Ö¸¶¨¶ÔÒ»¸öÎļþµÄËøÊÇÇ¿ÖÆÐԵĶø·Ç½¨
ÒéÐԵġ£
Èç¹ûÒ»¸ö½ø³ÌÊÔͼ¶Á¡¢Ð´Ò»¸öÇ¿ÖÆÐÔËøÆð×÷ÓõÄÎļþ£¬¶øÓû¶Á¡¢Ð´µÄ²¿·ÖÓÖÓÉÆäËü
½ø³Ì¼ÓÉÏÁ˶Á¡¢Ð´Ëø£¬´Ëʱ»á·¢ÉúÊ²Ã´ÄØ£¿¶ÔÕâÒ»ÎÊÌâµÄ»Ø´ðÈ¡¾öÓÚÈý·½ÃæµÄÒòËØ
£º²Ù×÷ÀàÐÍ£¨read»òwrite£©£¬ÆäËü½ø³Ì±£ÓеÄËøµÄÀàÐÍ£¨¶ÁËø»òÐ´Ëø£©£¬ÒÔ¼°ÓÐ
¹ØÃèÊö·ûÊÇ×èÈû»¹ÊÇ·Ç×èÈûµÄ¡£Í¼12.7ÏÔʾÁËÕâ°ËÖÖ¿ÉÄÜÐÔ¡£
ͼ12.7 Ç¿ÖÆÐÔËø¶ÔÆäËü½ø³Ì¶Á¡¢Ð´µÄÓ°Ïì
³ýÁËͼ12.7ÖеÄread,writeº¯Êý£¬ÆäËü½ø³ÌµÄÇ¿ÖÆÐÔËøÒ²»á¶Ôopenº¯Êý²úÉúÓ°Ïì¡£
ͨ³££¬¼´Ê¹ÕýÔÚ´ò¿ªµÄÎļþ¾ßÓÐÇ¿ÖÆÐÔ¼ÇÂ¼Ëø£¬¸Ã´ò¿ª²Ù×÷Ò²»á³É¹¦¡£ÏÂÃæµÄrea
d»òwriteÒÀ´ÓÓÚͼ12.7ÖÐËùʾµÄ¹æÔò¡£µ«ÊÇ£¬Èç¹ûÓû´ò¿ªµÄÎļþ¾ßÓÐÇ¿ÖÆÐÔËø£¨¶Á
Ëø»òÐ´Ëø£©£¬¶øÇÒopenµ÷ÓÃÖеÄflagΪO_TRUNC»òO_CREAT£¬Ôò²»ÂÛÊÇ·ñÖ¸¶¨O_NON
BLOCK,open¶¼Á¢¼´³ö´í·µ»Ø£¬erronÉèÖÃΪEAGAIN¡££¨¶ÔO_TRUNCÇé¿ö³ö´í·µ»ØÊÇÓÐ
ÒâÒåµÄ£¬ÒòΪÆäËü½ø³Ì¶Ô¸ÃÎļþ³ÖÓжÁ¡¢Ð´Ëø£¬ËùÒÔ²»Äܽ«Æä½Ø¶ÌΪ0¡£¶ÔO_CREA
TÇé¿öÔÚ·µ»ØÊ±Ò²ÉèÖÃerronÔòÎÞÒâÒ壬ÒòΪ¸Ã±êÖ¾µÄÒâÒåÊÇÈç¹û¸ÃÎļþ²»´æÔÚÔò´´
½¨£¬ÓÉÓÚÆäËü½ø³Ì¶Ô¸ÃÎļþ³ÖÓмÇÂ¼Ëø£¬Òò¶ø¸ÃÎļþ¿Ï¶¨ÊÇ´æÔڵġ££©
ÕâÖÖ´¦Àí·½Ê½¿ÉÄܵ¼ÖÂÁîÈ˾ªÒìµÄ½á¹û¡£ÎÒÃÇÔø±àд¹ýÒ»¸ö³ÌÐò£¬Ëü´ò¿ªÒ»¸öÎļþ
£¨ÆämodeÖ¸¶¨ÎªÇ¿ÖÆÐÔËø£©£¬È»ºó¶Ô¸ÃÎļþµÄÕûÌåÉèÖÃÒ»°Ñ¶ÁËø£¬È»ºó½øÈë˯ÃßÒ»
¶Îʱ¼ä¡£ÔÚÕâ¶Î˯Ãßʱ¼äÄÚ£¬ÓÃijЩ³£¹æµÄUnix³ÌÐòºÍ²Ù×÷·û¶Ô¸ÃÎļþ½øÐд¦Àí£¬
·¢ÏÖÏÂÁÐÇé¿ö£º
l ¿ÉÓÃed±à¼³ÌÐò¶Ô¸ÃÎļþ½øÐб༲Ù×÷£¬¶øÇұ༽á¹ûд»Ø´ÅÅÌ£¡Ç¿ÖÆÐÔ¼ÇÂ¼Ëø
¶Ô´ËºÁÎÞÓ°Ïì¡£¶Ôed²Ù×÷½øÐиú×Ù·ÖÎö·¢ÏÖ£¬ed½«ÐÂÄÚÈÝдµ½Ò»¸öÁÙʱÎļþÖУ¬È»
ºóɾ³ýÔÎļþ£¬×îºó½«ÁÙʱÎļþÃû¸ÄÃûΪÔÎļþÃû¡£ÓÚÊÇ£¬·¢ÏÖÇ¿ÖÆÐÔËø»úÖÆ¶Ôu
nlinkº¯ÊýûÓÐÓ°Ïì¡£
ÔÚSVR4ÖУ¬ÓÃtruss(1)ÃüÁî¿ÉÒԵõ½Ò»¸ö½ø³ÌµÄϵͳµ÷Óøú×ÙÐÅÏ¢£¬ÔÚ4.3+BSDÖÐ
£¬ÔòʹÓÃktrace(1)ºÍkdump(1)ÃüÁî¡£
l ²»ÄÜÓÃvi±à¼³ÌÐò±à¼¸ÃÎļþ¡£vi¿ÉÒÔ¶Á¸ÃÎļþ£¬µ«ÊÇÈç¹ûÊÔͼ½«ÐµÄÊý¾Ýдµ½
¸ÃÎļþÖУ¬Ôò³ö´í·µ»Ø£¨EAGAIN£©¡£Èç¹ûÊÔͼ½«ÐÂÊý¾ÝÌí¼Óµ½¸ÃÎļþÖУ¬Ôòwrite
×èÈû¡£viµÄÕâÖÖÐÐΪÓëËùÏ£ÍûµÄÒ»Ñù¡£
l ʹÓÃKornShellµÄ>ºÍ¡·Ëã·ûÖØÐ´»òÌíдµ½¸ÃÎļþÖУ¬²úÉú³ö´íÐÅÏ¢"cannot cre
at"¡£
l ÔÚBourne ShellÏÂʹÓÃ>Ëã·û³ö´í£¬µ«ÊÇʹÓá·Ëã·ûÔò×èÈû£¬ÔÚɾ³ýÁËÇ¿ÖÆÐÔËø
ºóÔÙ¼ÌÐø½øÐд¦Àí¡££¨Ö´ÐÐÌí¼Ó²Ù×÷Ëù²úÉúµÄÇø±ðÊÇÒòΪ£ºKorn ShellÒÔO_CREAT
ºÍO_APPEND±êÖ¾´ò¿ªÎļþ£¬¶øÉÏÃæÒÑÌá¼°Ö¸¶¨O_CREAT»á²úÉú³ö´í·µ»Ø¡£µ«ÊÇ£¬Bo
urne ShellÔÚ¸ÃÎļþÒÑ´æÔÚʱ²¢²»Ö¸¶¨O_CREAT£¬ËùÒÔopen³É¹¦£¬¶øÏÂÒ»¸öwriteÔò
×èÈû¡££©
´ÓÕâÑùÒ»¸öÀý×ÓÖпɼû£¬ÔÚʹÓÃÇ¿ÖÆÐÔËøÊ±»¹ÐèÓÐËù¾¯Ìè¡£
Ò»¸ö±ðÓÐÓÃÐĵÄÓû§¿ÉÒÔ¶Ô´ó¼Ò¶¼¿É¶ÁµÄÎļþ¼ÓÒ»°Ñ¶ÁËø£¨Ç¿ÖÆÐÔ£©£¬ÕâÑù¾ÍÄÜ×è
Ö¹ÈÎºÎÆäËüÈËд¸ÃÎļþ£¨µ±È»£¬¸ÃÎļþÓ¦µ±ÊÇÇ¿ÖÆÐÔËø»úÖÆÆð×÷Óõģ¬Õâ¿ÉÄÜÒªÇó
¸ÃÓû§Äܹ»¸ü¸Ä¸ÃÎļþµÄÐí¿ÉȨλ¡££©¿¼ÂÇÒ»¸öÊý¾Ý¿âÎļþ£¬ËüÊÇ´ó¼Ò¶¼¿É¶ÁµÄ£¬
²¢ÇÒÊÇÇ¿ÖÆÐÔËø»úÖÆÆð×÷Óõġ£Èç¹ûÒ»¸ö±ðÓÐÓÃÐĵÄÓû§¶Ô¸ÃÕû¸öÎļþ±£ÓÐÒ»°Ñ¶Á
Ëø£¬ÔòÆäËü½ø³Ì²»ÄÜÔÙд¸ÃÎļþ¡£
ʵÀý
³ÌÐò12.7 ¼ì²éÒ»¸öϵͳÊÇ·ñÖ§³ÖÇ¿ÖÆÐÔËø»úÖÆ¡£
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <errno.h>
#include <fcntl.h>
#include "ourhdr.h"
int
main(void)
{
int fd;
pid_t pid;
char buff[5];
struct stat statbuf;
if ( (fd = open("templock", O_RDWR | O_CREAT | O_TRUNC,
FILE_MODE)) < 0)
err_sys("open error");
if (write(fd, "abcdef", 6) != 6)
err_sys("write error");
/* turn on set-group-ID and turn off group-execute */
if (fstat(fd, &statbuf) < 0)
err_sys("fstat error");
if (fchmod(fd, (statbuf.st_mode & ~S_IXGRP) | S_ISGID) < 0)
err_sys("fchmod error");
TELL_WAIT();
if ( (pid = fork()) < 0) {
err_sys("fork error");
} else if (pid > 0) { /* parent */
/* write lock entire file */
if (write_lock(fd, 0, SEEK_SET, 0) < 0)
err_sys("write_lock error");
TELL_CHILD(pid);
if (waitpid(pid, NULL, 0) < 0)
err_sys("waitpid error");
} else { /* child */
WAIT_PARENT(); /* wait for parent to set lock */
set_fl(fd, O_NONBLOCK);
/* first let's see what error we get if region is locked */
if (read_lock(fd, 0, SEEK_SET, 0) != -1) /* no wait */
err_sys("child: read_lock succeeded");
printf("read_lock of already-locked region returns %d\n", errno);
/* now try to read the mandatory locked file */
if (lseek(fd, 0, SEEK_SET) == -1)
err_sys("lseek error");
if (read(fd, buff, 2) < 0)
err_ret("read failed (mandatory locking works)");
else
printf("read OK (no mandatory locking), buff = %2.2s\n", buff);
}
exit(0);
}
³ÌÐò12.7 ¼ì²éÊÇ·ñÖ§³ÖÇ¿ÖÆÐÔËø
´Ë³ÌÐòÊ×ÏÈ´´½¨Ò»¸öÎļþ£¬²¢Ê¹Ç¿ÖÆÐÔËø»úÖÆ¶ÔÆäÆð×÷Óá£È»ºóforkÒ»¸ö×Ó½ø³Ì¡£
¸¸½ø³Ì¶ÔÕû¸öÎļþÉèÖÃÒ»°ÑÐ´Ëø£¬×Ó½ø³ÌÔò½«¸ÃÎļþµÄÃèÊö·ûÉèÖÃΪ·Ç×èÈûµÄ£¬È»
ºóÆóͼ¶Ô¸ÃÎļþÉèÖÃÒ»°Ñ¶ÁËø£¬ÎÒÃÇÆÚÍûÕâ»á³ö´í·µ»Ø£¬²¢Ï£Íû¿´µ½ÏµÍ³·µ»ØÖµÊÇ
EACCES»òEAGAIN¡£½Ó×Å£¬×Ó½ø³Ì½«Îļþ¶Á¡¢Ð´Î»Öõ÷Õûµ½ÎļþÆðµã£¬²¢ÊÔͼ¶Á¸ÃÎÄ
¼þ¡£Èç¹ûϵͳÌá¹©Ç¿ÖÆÐÔËø»úÖÆ£¬ÔòreadÓ¦·µ»ØEACCES»òEAGAIN£¨ÒòΪ¸ÃÃèÊö·ûÊÇ
·Ç×èÈûµÄ£©¡£·ñÔòread·µ»ØËù¶ÁµÄÊý¾Ý¡£ÔÚSVR4ÖÐÔËÐд˳ÌÐò£¨¸Ãϵͳ֧³ÖÇ¿ÖÆÐÔ
Ëø»úÖÆ£©£¬µÃµ½£º
$ a.out
read_lock of already-locked region returns 13
read failed (mandatory locking works):No more processes
²é¿´ÏµÍ³Í·Îļþ»òintro(2)ÊÖ²áÒ³£¬¿ÉÒÔ¿´µ½´íÎó13¶ÔÓ¦ÓÚEACCES¡£´ÓÀý×ÓÖл¹¿É
ÒÔ¿´µ½£¬ÔÚread³ö´í·µ»ØÐÅÏ¢²¿·ÖÖаüº¬ÓÐ"No more processes"¡£Õâͨ³£À´×ÔÓÚ
fork£¬±íʾÒÑÓÃÍêÁ˽ø³Ì±íÏî¡£
$ a.out
read_lock of already_locked region returns 35
read OK (no mandatory locking),buff=ab
ÆäÖУ¬errno35¶ÔÓ¦ÓÚEAGAIN¡£¸Ãϵͳ²»Ö§³ÖÇ¿ÖÆÐÔËø¡£
ʵÀý
ÈÃÎÒÃǻص½±¾½ÚµÄµÚÒ»¸öÎÊÌ⣺µ±Á½¸öÈËͬʱ±à¼Í¬Ò»¸öÎļþ½«»áÔõÑùÄØ£¿Ò»°ãµÄ
UNIXÎı¾±à¼Æ÷²¢²»Ê¹ÓüÇÂ¼Ëø£¬ËùÒÔ¶Ô´ËÎÊÌâµÄ»Ø´ðÈÔÈ»ÊÇ£º¸ÃÎļþµÄ×îºó½á¹û
È¡¾öÓÚд¸ÃÎļþµÄ×îºóÒ»¸ö½ø³Ì¡££¨4.3+BSD vi±à¼Æ÷ȷʵÓÐÒ»¸ö±àÒëʱѡÔñÏîʹ
ÔËÐÐʱ½¨ÒéÐÔ¼ÇÂ¼ËøÆð×÷Ó㬵«ÊÇÕâһѡÔñÏî²¢²»ÊÇȱʡ¿ÉÓõġ££©¼´Ê¹ÎÒÃÇÔÚÒ»
¸ö±à¼Æ÷£¬ÀýÈçviÖÐʹÓÃÁ˽¨ÒéÐÔËø£¬¿ÉÊÇÕâ°ÑËø²¢²»ÄÜ×èÖ¹ÆäËûÓû§Ê¹ÓÃÁíÒ»¸ö
±à¼Æ÷£¬¸Ã±à¼Æ÷ûÓÐʹÓý¨ÒéÐÔ¼ÇÂ¼Ëø¡£
ÈôϵͳÌá¹©Ç¿ÖÆÐÔ¼ÇÂ¼Ëø£¬ÄÇôÎÒÃÇ¿ÉÒÔÐ޸ij£ÓÃµÄ±à¼Æ÷£¨Èç¹ûÎÒÃÇÓÐ¸Ã±à¼Æ÷
µÄÔ´´úÂë¡££©ÈçÈôÎÒÃÇûÓÐ¸Ã±à¼Æ÷µÄÔ´´úÂ룬ÄÇôÎÒÃÇ¿ÉÒÔÊÔÒ»ÊÔÏÂÊö·½·¨¡£±à
дһ¸öviµÄǰ¶Ë³ÌÐò¡£¸Ã³ÌÐòÁ¢¼´µ÷ÓÃfork£¬È»ºó¸¸½ø³ÌµÈ´ý×Ó½ø³ÌÖÕÖ¹£¬×Ó½ø³Ì
´ò¿ªÔÚÃüÁîÐÐÖÐÖ¸¶¨µÄÎļþ£¬Ê¹Ç¿ÖÆÐÔËøÆð×÷Ó㬶ÔÕû¸öÎļþÉèÖÃÒ»°ÑÐ´Ëø£¬È»ºó
exec vi¡£ÔÚviÔËÐÐʱ£¬¸ÃÎļþÊǼÓÁËÐ´ËøµÄ£¬ËùÒÔÆäËûÓû§²»ÄÜÐÞ¸ÄËü¡£µ±vi½á
ÊøÊ±£¬¸¸½ø³Ì´Ówait·µ»Ø£¬´ËʱÎÒÃÇ×Ô±àµÄǰ¶Ë³ÌÐòÒ²¾Í½áÊø¡£ÔÚ±¾ÀýÖмٶ¨ËøÄÜ
¿çÔ½exec,ÕâÕýÊÇÎÒÃÇÇ°ÃæËù˵µÄSVR4µÄÇé¿ö£¨SVR4ÊÇÎÒÃÇ˵¹ýµÄÌá¹©Ç¿ÖÆÐÔËøµÄ
Ψһϵͳ£©¡£
ÕâÖÖÀàÐ͵Äǰ¶Ë³ÌÐòÊÇ¿ÉÒÔ±àдµÄ£¬µ«È´ÍùÍù²»ÄÜÆð×÷Óá£ÎÊÌâ³öÔÚ´ó¶àÊý±à¼Æ÷
£¨ÖÁÉÙÊÇviºÍed£©¶ÁËüÃǵÄÊäÈëÎļþ£¬È»ºó¹Ø±ÕËü¡£Ö»ÒªÒýÓñ»±à¼ÎļþµÄÃèÊö·û
¹Ø±ÕÁË£¬ÄÇô¼ÓÔÚ¸ÃÎļþÉϵÄËø¾Í±»ÊÍ·ÅÁË¡£ÕâÒâζ×Å£¬ÔÚ±à¼Æ÷¶ÁÁ˸ÃÎļþµÄÄÚ
ÈÝ£¬È»ºó¹Ø±ÕÁËËü£¬ÄÇÃ´ËøÒ²¾Í²»´æÔÚÁË¡£ÔÚǰ¶Ë³ÌÐòÖÐûÓÐÈκη½·¨¿ÉÒÔ×èÖ¹Õâ
Ò»µã¡£
ÔÚµÚÊ®ÁùÕµÄÊý¾Ý¿âº¯Êý¿âÖУ¬ÎÒÃÇʹÓÃÁ˼ÇÂ¼ËøÒÔ×èÖ¹¶à¸ö½ø³ÌµÄ²¢·¢´æÈ¡¡£ÔÚ
±¾Õ£¬ÎÒÃÇÌṩÁËʱ¼ä²âÁ¿ÒÔ¹Û²ì¼ÇÂ¼Ëø¶Ô½ø³ÌµÄÓ°Ïì¡£
12.4Á÷£¨Streams£©
Á÷ÊÇϵͳVÌṩµÄ¹¹ÔìÄÚºËÉ豸Çý¶¯³ÌÐòºÍÍøÂçÐÒé°üµÈµÄÒ»ÖÖͨÓ÷½·¨£¬ÎÒÃǶÔ
Á÷½øÐÐÌÖÂÛµÄÄ¿µÄÊÇÀí½âÏÂÁи÷µã£º
£¨a£© ϵͳVµÄÖն˽çÃæ¡£
£¨b£© I/O¶à·¸´ÓÃÖÐÂÖѯº¯ÊýµÄʹÓã¨12.5.2½Ú£©¡£
£¨c£© »ùÓÚÁ÷µÄ¹ÜµÀºÍÃüÃûÁ÷¹ÜµÀµÄʵÏÖ£¨15.2ºÍ12.5.2½Ú£©¡£
Á÷»úÖÆÊÇÓÉDennis Ritchie ·¢Õ¹ÆðÀ´µÄ[Ritchie 1984],ÆäÄ¿µÄÊÇÓÃͨÓá¢Áé»îµÄ
·½·¨¸Äд´«Í³µÄ×Ö·ûI/Oϵͳ²¢ÊÊÓ¦ÍøÂçÐÒéµÄÐèÒª£¬ºóÀ´Á÷»úÖÆ±»¼ÓÈëSVR3¡£SV
R4ÔòÌṩÁ˶ÔÁ÷£¨»ùÓÚÁ÷µÄÖÕ¶ËI/Oϵͳ£©µÄÈ«ÃæÖ§³Ö¡£[AT&T 1990d]¶ÔSVR4ʵÏÖ
½øÐÐÁË˵Ã÷¡£
Çë×¢Òâ²»Òª½«±¾ÕÂ˵Ã÷µÄÁ÷Óë±ê×¼I/O¿â£¨5.2½Ú£©ÖÐʹÓõÄÁ÷Ïà»ìÏý¡£
Ò»¸öÁ÷ÔÚÓû§½ø³ÌºÍÉ豸Çý¶¯³ÌÐòÖ®¼äÌṩÁËÒ»Ìõȫ˫¹¤Í¨Â·¡£Á÷ÎÞÐèºÍʵ¼ÊÓ²¼þ
É豸ֱ½Ó¶Ô»°-Á÷Ò²¿ÉÒÔÓÃ×÷ΪαÉ豸Çý¶¯³ÌÐò¡£Í¼12.8ʾ³öÁËÒ»¸ö¼òµ¥Á÷µÄ»ù±¾
½á¹¹¡£
ͼ12.8 Ò»¸ö¼òµ¥Á÷
ÔÚÁ÷Ê×֮ϿÉÒÔѹÈë´¦ÀíÄ£¿é¡£Õâ¿ÉÒÔÓÃioctlʵÏÖ¡£Í¼12.9ʾ³öÁËÒ»¸ö°üº¬Ò»¸ö
´¦ÀíÄ£¿éµÄÁ÷¡£¸÷·½¿òÖ®¼äÓÃÁ½¸ù´ø¼ýÍ·µÄÏßÁ¬½Ó£¬ÒÔÇ¿µ÷Á÷µÄȫ˫¹¤ÌØÕ÷¡£
ÈÎÒâ¸öÊýµÄ´¦ÀíÄ£¿é¿ÉÒÔѹÈëÁ÷¡£ÎÒÃÇʹÓÃÊõÓï"ѹÈë"£¬ÕâÊÇÒòΪÿһÐÂÄ£¿é×ÜÊÇ
²åµ½Á÷Ê×֮ϣ¬¶ø½«ÒÔǰѹÈëµÄÄ£¿éÏÂѹ¡££¨ÕâÀàËÆÓÚºó½ø¡¢ÏȳöµÄÕ»¡££©ÔÚͼ1
2.9ÖУ¬ÎÒÃDZê³öÁËÁ÷µÄÁ½²à£¬·Ö±ð³ÆÎªË³Á÷£¨downstream£©ºÍÄæÁ÷£¨upstream£©
¡£Ð´µ½Á÷Ê×µÄÊý¾Ý½«Ë³Á÷¶øÏ´«ËÍ¡£ÓÉÉ豸Çý¶¯³ÌÐò¶Áµ½µÄÊý¾ÝÔòÄæÁ÷ÏòÉÏ´«ËÍ¡£
ͼ12.9 ¾ßÓд¦ÀíÄ£¿éµÄÁ÷
Á÷Ä£¿éÊÇ×÷ΪºËÐIJ¿·ÖÖ´Ðеģ¬ÕâÀàËÆÓÚÉ豸Çý¶¯³ÌÐò£¬µ±¹¹ÔìºËÐÄʱ£¬Á÷Ä£¿éÁ¬
±à½øÈëºËÐÄ¡£´ó¶àÊýϵͳ²»ÔÊÐí½«Ä©Á¬±à½øÈëºËÐĵÄÁ÷Ä£¿éѹÈëÁ÷¡£
ÔÚͼ11.2ÖÐʾ³öÁË»ùÓÚÁ÷µÄÖÕ¶ËϵͳµÄÒ»°ã½á¹¹¡£Í¼Öбê³öµÄ"¶Á¡¢Ð´"º¯ÊýÊÇÁ÷Ê×
¡£±êעΪ"ÖÕ¶ËÐйæ³Ì"µÄ¿òÊÇÒ»¸öÁ÷´¦ÀíÄ£¿é¡£¸Ã´¦ÀíÄ£¿éµÄʵ¼ÊÃû³ÆÊÇldterm¡£
£¨¸÷ÖÖÁ÷Ä£¿éµÄÊÖ²áÒ³ÔÚ[AT&T 1990d]µÄµÚ7½ÚºÍ[AT&T 1991]µÄµÚ7½ÚÖС£
ÓõÚÈýÕÂÖÐ˵Ã÷µÄº¯Êý´æÈ¡Á÷£¬ËüÃÇÊÇ£ºopen¡¢close¡¢read¡¢writeºÍioctl¡£Áí
Í⣬ÔÚSVR3ºËÖÐÔö¼ÓÁË3¸öÖ§³ÖÁ÷µÄк¯Êý£¨getmsg¡¢putmsg¡¢ºÍpoll£©£¬ÔÚSVR4
ÖÐÓÖ¼ÓÁËÁ½¸ö´¦ÀíÁ÷²»Í¬ÓÅÏȼ¶²¨¶ÎÏûÏ¢µÄº¯Êý£¨getpmsgºÍputpmsg£©¡£±¾½Ú½«Ëµ
Ã÷ÕâЩк¯Êý£¬ÎÒÃÇΪÁ÷´ò¿ªµÄ·¾¶Ãûͨ³£ÔÚ/devĿ¼֮Ï¡£ÓÃls -l²é¿´É豸Ãû
£¬¾ÍÄÜÅжϸÃÉ豸ÊÇ·ñΪÁ÷É豸¡£ËùÓÐÁ÷É豸¶¼ÊÇ×Ö·ûÌØÊâÎļþ¡£
ËäȻijЩÓйØÁ÷µÄÎÄÏ×°µÊ¾ÎÒÃÇ¿ÉÒÔ±àд´¦ÀíÄ£¿é£¬²¢½«ËüÃÇѹÈëÁ÷ÖУ¬µ«ÊDZàд
ÕâЩģ¿éÈçͬ±àдÉ豸Çý¶¯³ÌÐòÒ»Ñù£¬ÐèҪרÃŵļ¼Êõ¡£
ÔÚÁ÷»úÖÆÖ®Ç°,ÖÕ¶ËÊÇÓÃÏÖ´æµÄclist»úÖÆ´¦ÀíµÄ¡£(Bach [1986]µÄ10.3.1½ÚºÍ L
effler et al[1989]µÄ9.6½Ú)·Ö±ð˵Ã÷SVR2ºÍ4.3BSDÖеÄclist »úÖÆ¡£½«»ùÓÚ×Ö·û
µÄÉ豸Ìí¼Óµ½ºËÐÄÖÐͨ³£Éæ¼°±àдÉ豸Çý¶¯³ÌÐò£¬½«ËùÓÐÓйز¿·Ö¶¼°²ÅÅÔÚÇý¶¯³Ì
ÐòÖС£¶ÔÐÂÉ豸µÄ´æÈ¡µäÐ͵ØÍ¨¹ýÔʼÉ豸½øÐУ¬ÕâÒâζ×Åÿ¸öÓû§µÄread,writ
e¶¼Ö±Í¨½øÈëÉ豸Çý¶¯³ÌÐò¡£Á÷»úÖÆÊ¹ÕâÖÖ½»»¥×÷Ó÷½Ê½¸ü¼ÓÁé»î£¬ÌõÀíÇåÎú£¬Ê¹
µÃÊý¾Ý¿ÉÒÔÓÃÁ÷ÏûÏ¢·½Ê½ÔÚÁ÷Ê׺ÍÇý¶¯³ÌÐòÖ®¼ä´«ËÍ£¬²¢Ê¹ÈÎÒâÊýµÄÖм䴦ÀíÄ£¿é
¿É¶ÔÊý¾Ý½øÐвÙ×÷¡£
Á÷ÏûÏ¢
Á÷µÄËùÓÐÊäÈëºÍÊä³ö¶¼»ùÓÚÏûÏ¢¡£Á÷Ê׺ÍÓû§Ê¹ÓÃread¡¢write¡¢getmsg¡¢getpms
g¡¢putmsgºÍputpmsg½»»»ÏûÏ¢¡£ÔÚÁ÷Êס¢¸÷´¦ÀíÄ£¿éºÍÉ豸Çý¶¯³ÌÐòÖ®¼ä£¬ÏûÏ¢¿É
ÒÔ˳Á÷¶øÏ£¬Ò²¿ÉÒÔÄæÁ÷¶øÉÏ¡£
ÔÚÓû§½ø³ÌºÍÁ÷Ê×Ö®¼ä£¬ÏûÏ¢ÓÉÏÂÁм¸²¿·Ö×é³É£ºÏûÏ¢ÀàÐÍ¡¢¿ÉÑ¡ÔñµÄ¿ØÖÆÐÅÏ¢£¬
ÒÔ¼°¿ÉÑ¡ÔñµÄÊý¾Ý¡£ÔÚͼ12.10ÖÐʾ³öÁ˶ÔÓ¦ÓÚwrite¡¢putmsgºÍputpmsgµÄ²»Í¬²Î
Êý£¬Ëù²úÉúµÄ²»Í¬ÏûÏ¢ÀàÐÍ¡£¿ØÖÆÐÅÏ¢ºÍÊý¾Ý´æ·ÅÔÚstrbuf½á¹¹ÖУº
struct strbuf {
int maxlen; »º´æ´óС
int Len; µ±Ç°ÔÚ»º´æÖеÄ×Ö½ÚÊý
char *buf »º´æÖ¸Õë
}£»
ͼ12.10 Ϊwrite¡¢putmsgºÍputpmsg²úÉúµÄÁ÷ÏûÏ¢µÄÀàÐÍ
µ±ÓÃputmsg»òputpmsg·¢ËÍÏûϢʱ£¬lenÖ¸¶¨»º´æÖÐÊý¾ÝµÄ×Ö½ÚÊý¡£µ±ÓÃgetmsg»òg
etpmsg½ÓÊÕÏûϢʱ£¬maxlen Ö¸¶¨»º´æ³¤¶È£¨Ê¹ºËÐIJ»»áÒç³ö»º´æ£©£¬¶ølenÔòÓɺË
ÐÄÉèÖã¬ËµÃ÷´æ·ÅÔÚ»º´æÖеÄÊý¾ÝÁ¿¡£0³¤ÏûÏ¢ÊÇÔÊÐíµÄ£¬lenΪ-1˵Ã÷ûÓпØÖÆÐÅ
Ï¢»òÊý¾Ý¡£
ΪʲôÎÒÃÇÐèÒª´«ËÍ¿ØÖÆÐÅÏ¢ºÍÊý¾ÝÁ½ÕßÄØ£¿ÌṩÕâÁ½ÕßʹÎÒÃÇ¿ÉÒÔʵÏÖÓû§½ø³Ì
ºÍÁ÷Ö®¼äµÄ½çÃæ¡£Olander,McGrathºÍIsrael[1986]˵Ã÷ÁËϵͳV·þÎñ½çÃæµÄÔÏÈʵ
ÏÖ¡£AT&T[1990d]µÚÎåÕÂÏêϸ˵Ã÷ÁË·þÎñ½çÃæ,»¹Ê¹ÓÃÁËÒ»¸ö¼òµ¥µÄʵÀý¡£¿ÉÄÜ×îΪ
ÈËÁ˽âµÄ·þÎñ½çÃæÊÇϵͳVµÄ´«Êä²ã½çÃæ(TLI)£¬ËüÌṩÁËÍøÂçϵͳ½çÃæ£¬Stevens
[1990]µÚÆßÕ¶Դ˽øÐÐÁË˵Ã÷¡£
¿ØÖÆÐÅÏ¢µÄÁíÒ»¸öÀý×ÓÊÇ·¢ËÍÒ»¸öÎÞÁ¬½ÓµÄÍøÂçÏûÏ¢£¨Êý¾Ý±¨£©¡£ÎªÁË·¢Ë͸ÃÏûÏ¢
£¬ÎÒÃÇÐèҪ˵Ã÷ÏûÏ¢µÄÄÚÈÝ£¨Êý¾Ý£©ºÍ¸ÃÏûÏ¢µÄÄ¿µÄµØÖ·£¨¿ØÖÆÐÅÏ¢£©¡£Èç¹ûÎÒÃÇ
²»Äܽ«Êý¾ÝºÍ¿ØÖÆÒ»Æð·¢ËÍ£¬ÄÇô¾ÍҪijÖÖרÃÅÉè¼ÆµÄ·½°¸¡£ÀýÈ磬ÎÒÃÇ¿ÉÒÔÓÃi
octl˵Ã÷µØÖ·£¬È»ºóÓÃwrite·¢ËÍÊý¾Ý¡£ÁíÒ»ÖÖ¼¼Êõ¿ÉÄÜÒªÇ󣺵ØÖ·Õ¼ÓÃÊý¾ÝµÄǰ
N¸ö×Ö½Ú£¬ÓÃwriteдÊý¾Ý¡£½«¿ØÖÆÐÅÏ¢ÓëÊý¾Ý·Ö¿ª£¬²¢ÇÒÌṩ´¦ÀíÁ½Õߵĺ¯Êý£¨p
utmsgºÍgetmsg£©ÊÇ´¦ÀíÕâÖÖÎÊÌâµÄ½ÏÇåÎúµÄ·½·¨¡£
ÓÐÔ¼25ÖÖ²»Í¬ÀàÐ͵ÄÏûÏ¢£¬µ«ÊÇÖ»ÓÐÉÙÊý¼¸ÖÖÓÃÓÚÓû§½ø³ÌºÍÁ÷Ê×Ö®¼ä¡£ÆäÓàµÄÔò
Ö»ÔÚºËÐÄÖÐ˳Á÷¡¢ÄæÁ÷´«ËÍ¡££¨¶ÔÓÚ±àдÁ÷´¦ÀíÄ£¿éµÄÈËÔ±¶øÑÔ£¬ÕâЩÏûÏ¢ÊǷdz£
ÓÐÓõ쬵«ÊǶԱàдÓû§¼¶´úÂëµÄÈËÔ±¶øÑÔ£¬Ôò¿ÉºöÂÔËüÃÇ¡££©ÔÚÎÒÃÇËùʹÓõĺ¯
Êý£¨read¡¢write¡¢getmsg¡¢getpmsg¡¢putmsgºÍputpmsg£©ÖУ¬Ö»Éæ¼°ÈýÖÖÏûÏ¢Àà
ÐÍ£¬ËüÃÇÊÇ£º
l M_DATA£¨I/OµÄÓû§Êý¾Ý£©£»
l M_PROTO£¨ÐÒé¿ØÖÆÐÅÏ¢£©£»
l M_PCPROTO£¨¸ßÓÅÏȼ¶ÐÒé¿ØÖÆÐÅÏ¢£©¡£
Á÷ÖеÄÏûÏ¢¶¼ÓÐÒ»¸öÅŶÓÓÅÏȼ¶£»
l ¸ßÓÅÏȼ¶ÏûÏ¢£¨×î¸ßÓÅÏȼ¶£©£»
l ÓÅÏȲ¨¶ÎÏûÏ¢£»
l ÆÕͨÏûÏ¢£¨×îµÍÓÅÏȼ¶£©¡£
ÆÕͨÏûÏ¢ÊÇÓÅÏȲ¨¶ÎΪ0µÄÏûÏ¢¡£ÓÅÏȲ¨¶ÎÏûÏ¢µÄ²¨¶Î¿ÉÔÚ1-255Ö®¼ä£¬²¨¶ÎÓú¸ß£¬
ÓÅÏȼ¶Ò²Óú¸ß¡£
ÿ¸öÁ÷Ä£¿éÓÐÁ½¸öÊäÈë¶ÓÁС£Ò»¸ö½ÓÊÕÀ´×ÔËüÉÏÃæÄ£¿éµÄÏûÏ¢£¨ÕâÖÖÏûÏ¢´ÓÁ÷Ê×Ïò
Çý¶¯³ÌÐò˳Á÷´«ËÍ£©¡£ÁíÒ»¸ö½ÓÊÕÀ´×ÔËüÏÂÃæÄ£¿éµÄÏûÏ¢£¨ÕâÖÖÏûÏ¢´ÓÇý¶¯³ÌÐòÏò
Á÷Ê×ÄæÁ÷´«ËÍ£©¡£ÔÚÊäÈë¶ÓÁÐÖеÄÏûÏ¢°´ÓÅÏȼ¶´Ó¸ßµ½µÍÅÅÁС£ÔÚͼ12.10ÖУ¬ÎÒ
ÃÇʾ³öÁËÕë¶Ôwrite¡¢putmsgºÍputpmsgµÄ²»Í¬²ÎÊý£¬²úÉú²»Í¬ÓÅÏȼ¶µÄÏûÏ¢¡£
ÓÐһЩÏûÏ¢ÎÒÃÇδ¼Ó¿¼ÂÇ¡£ÀýÈ磬ÈôÁ÷Ê×´ÓËüÏÂÃæ½ÓÊÕµ½M_SIGÏûÏ¢£¬Ôò²úÉú
Ò»Ðźš£ÕâÖÖ·½·¨ÓÃÓÚÖÕ¶ËÐйæ³ÌÄ£¿éÏòÏà¹ØÇ°Ì¨½ø³Ì×é·¢ËÍÖն˲úÉúµÄÐźÅ
putmsgºÍputpmsgº¯Êý
putmsgºÍputpmsgº¯ÊýÓÃÓÚ½«Á÷ÏûÏ¢£¨¿ØÖÆÐÅÏ¢»òÊý¾Ý£¬»òÁ½Õߣ©Ð´ÖÁÁ÷ÖС£ÕâÁ½
¸öº¯ÊýµÄÇø±ðÊǺóÕßÔÊÐí¶ÔÏûÏ¢Ö¸¶¨Ò»¸öÓÅÏȲ¨¶Î¡£
_______________________________________________________________________
_______
#include <stropts.h>
int putmsg(int filedes,const struct strbug *ctlptr,
const struct strbuf *dataptr,int flag);
int uptpmsg(int filedes,const struct strbuf *ctlptr,
const struct strbuf *dataptr,int band,int flag);
Á½¸öº¯Êý·µ»Ø£ºÈô³É¹¦Îª0,³ö´íΪ-1
_______________________________________________________________________
________
¶ÔÁ÷Ò²¿ÉÒÔʹÓÃwriteº¯Êý£¬ËüµÈЧÓÚ²»´øÈκοØÖÆÐÅÏ¢£¬flagΪ0µÄputmsg¡£
ÕâÁ½¸öº¯Êý¿ÉÒÔ²úÉúÈýÖÖ²»Í¬ÓÅÏȼ¶µÄÏûÏ¢£ºÆÕͨ¡¢ÓÅÏȲ¨¶ÎºÍ¸ßÓÅÏȼ¶¡£Í¼12.
10ÏêϸÁгöÁËÕâÁ½¸öº¯ÊýÖм¸¸ö²ÎÊýµÄ¸÷ÖÖ¿ÉÄÜ×éºÏ£¬ÒÔ¼°Ëù²úÉúµÄ²»Í¬ÀàÐ͵ÄÏû
Ï¢¡£
ͼ12.10 write,putmsgºÍputpmsgËù²úÉúµÄÁ÷ÏûÏ¢ÀàÐÍ
ÔÚ´ËͼÖУ¬ÏûÏ¢¿ØÖÆÁÐÖеÄ"·ñ"£¨no£©¶ÔÓ¦ÓÚ¿Õctlptr²ÎÊý£¬»òctlptr->lenΪ-1
¡£¸ÃÁÐÖеÄ"ÊÇ"¶ÔÓ¦ÓÚctlptrÊǷǿգ¬ÒÔ¼°ctlptr->len´óÓÚµÈÓÚ0¡£ÕâЩ˵Ã÷ͬÑù
ÊÊÓÃÓÚÏûÏ¢µÄÊý¾Ý²¿·Ö£¨ÓÃdataptr´úÌæctlptr£©¡£
Á÷ ioct l²Ù×÷
ÔÚSVR4ÖУ¬Ê¹ÓÃioctl¿É¶ÔÁ÷Ö´ÐÐ29ÖÖ²»Í¬µÄ²Ù×÷¡£¹ØÓÚÕâЩ²Ù×÷µÄ˵Ã÷Çë¼ûstre
amio(7)ÊÖ²áÒ³£¨AT&T1990d£©£¬Í·Îļþ<stropts.h>Ó¦°üÀ¨ÔÚʹÓÃÕâЩ²Ù×÷µÄC´úÂë
ÖС£ioctlµÄµÚ2¸ö²ÎÊýrequest˵Ã÷Ö´ÐÐ29¸ö²Ù×÷ÖеÄÄÇÒ»¸ö¡£ËùÓÐrequest¶¼ÒÔI
_¿ªÊ¼¡£µÚ3¸ö²ÎÊýÔòÓërequestÓйء£ÓÐʱµÚ3¸ö²ÎÊýÊÇÒ»¸öÕûÐÍÖµ£¬ÓÐʱËüÊÇÖ¸Ïò
Ò»¸öÕûÐÍ»òÒ»¸öÊý¾Ý½á¹¹µÄÖ¸Õë¡£
ʵÀý-isastreamº¯Êý
ÓÐʱÐèҪȷ¶¨Ò»¸öÃèÊö·ûÊÇ·ñÒýÓÃÒ»¸öÁ÷¡£ÕâÓëµ÷ÓÃisattyº¯ÊýÀ´È·¶¨Ò»¸öÃèÊö·û
ÊÇ·ñÒýÓÃÒ»¸öÖÕ¶ËÉ豸ÏàÀàËÆ£¨11.9½Ú£©¡£SVR4Ìṩisastreamº¯Êý¡£
int isastream(int filedes);
·µ»Ø£ºÈôÊÇÁ÷·µ»Ø1£¬·ñÔò·µ»Ø0
£¨ÓÉÓÚijÖÖÔÒò£¬SVR4µÄÉè¼ÆÕßÍü¼Ç½«´Ëº¯ÊýµÄÔÐÍ·ÅÔÚÍ·ÎļþÖУ¬ËùÒÔÎÒÃÇÒ²²»
ÄÜΪ´Ëº¯ÊýдһÌõ#includeÓï¾ä¡££©
ÓëisattyÀàËÆ£¬Ëüͨ³£ÊÇÓÃÒ»¸öÖ»¶ÔÁ÷É豸²ÅÓÐЧµÄioctlº¯ÊýÀ´½øÐвâÊÔµÄ
¡£³ÌÐò12.8ÊǸú¯ÊýµÄÒ»ÖÖ¿ÉÄܵÄʵÏÖ¡£ËüʹÓÃI_CANPUT ioctlÀ´²âÊÔÓɵÚ3¸ö²Î
Êý˵Ã÷µÄÓÅÏȲ¨¶ÎÊÇ·ñÊÇ¿ÉдµÄ£¿Èç¹û¸ÃioctlÖ´Ðгɹ¦£¬ÔòËü¶ÔËùÉæ¼°µÄÁ÷²¢Ä©
×÷Èκθı䡣
#include <stropts.h>
#include <unistd.h>
int
isastream(int fd)
{
return(ioctl(fd, I_CANPUT, 0) != -1);
}
³ÌÐò12.8 ¼ì²éÃèÊö·ûÊÇ·ñÒýÓÃÁ÷É豸
³ÌÐò12.9 ¿ÉÓÃÓÚ²âÊԴ˺¯Êý¡£
#include <sys/types.h>
#include <sys/fcntl.h>
#include "ourhdr.h"
int
main(int argc, char *argv[])
{
int i, fd;
for (i = 1; i < argc; i++) {
printf("%s: ", argv[i]);
if ( (fd = open(argv[i], O_RDONLY)) < 0) {
err_ret("%s: can't open", argv[i]);
continue;
}
if (isastream(fd) == 0)
err_ret("%s: not a stream", argv[i]);
else
err_msg("%s: streams device", argv[i]);
}
exit(0);
}
³ÌÐò12.9 ²âÊÔisasteamº¯Êý
ÔËÐд˳ÌÐò£¬µÃµ½ºÜ¶àÓÉioctlº¯Êý·µ»ØµÄ³ö´íÐÅÏ¢¡£
$ a.out /dev/tty /dev/vidadm /dev/null /etc/motd
/dev/tty:/dev/tty:streams device
/dev/vidadm:/dev/vidadm:not a stream:Invalid argument
/dev/null:/dev/null:not a stream:No suck device
/etc/motd: /etc/motd:not a stream:Not a typewriter
/dev/ttyÔÚSVRÖ®ÏÂÊǸöÁ÷É豸£¬ÕâÓëÎÒÃÇËùÆÚÍûµÄÒ»Ö¡£/dev/vidadm²»ÊÇÒ»¸öÁ÷
É豸£¬µ«ÊÇËüÊÇÖ§³ÖÆäËüioctlÇëÇóµÄ×Ö·ûÌØÊâÎļþ¡£¶ÔÓÚ²»ÖªµÀÕâÖÖioctlÇëÇóµÄ
É豸£¬Ëü·µ»ØEINVAL¡£/dev/nullÊÇÒ»ÖÖ²»Ö§³ÖÈκÎioctl²Ù×÷µÄ×Ö·ûÌØÊâÎļþ£¬Ëù
ÒÔioctl·µ»ØENODEV¡£×îºó£¬/etc/motdÊÇÒ»¸öÆÕͨÎļþ£¬¶ø²»ÊÇ×Ö·ûÌØÊâÎļþ£¬Ëù
ÒÔ·µ»ØENOTTY£¨ÕâÊÇÔÚÕâÖÖÇé¿öϵĵäÐÍ·µ»ØÖµ£©¡£
ENOTTY£¨"²»ÊÇ´ò×Ö»ú"£©ÊǸöÀúÊ·²úÎµ±ioctlÆóͼ¶Ô²¢²»ÒýÓÃ×Ö·ûÌØ
ÊâÉ豸
µÄÃèÊö·û½øÐвÙ×÷ʱ£¬UnixϵͳºË¶¼·µ»ØENOTTY¡£
ʵÀý
Èç¹ûioctl²ÎÊýrequestÊÇI_LIST£¬Ôòϵͳ·µ»Ø¸ÃÁ÷ÉÏËùÓÐÄ£¿éµÄÃû×Ö£¬°üÀ¨×î¶¥¶Ë
µÄÇý¶¯³ÌÐò¡£ÆäµÚ3¸ö²ÎÊýÓ¦µ±ÊÇÖ¸Ïòstr_list½á¹¹ÊÇÖ¸Õë¡£
struct str_list{
int sl_nmods; Êý×éÖÐÏîµÄÊýÄ¿
struct str_modlist *sl_modlist; Ö¸ÏòÊý×éÖеÚÒ»¸öÔªËØµÄÖ¸Õë
};
Ó¦½«sl_modlistÉèÖÃΪָÏòstr_mlist½á¹¹Êý×éµÄµÚÒ»¸öÔªËØ£¬½«sl_nmodsÉèÖÃΪ
¸ÃÊý×éÖеÄÏîÊý¡£
struct str_mlist {
char l_name[FMNAMESZ+1]; ÒÔnull½áβµÄÄ£¿éÃû×Ö
};
³£ÊýFMNAMESZ¶¨ÒåÔÚÍ·Îļþ<sys/conf.h>ÖУ¬ÆäÖµ³£³£ÊÇ8¡£l_nameµÄʵ¼Ê³¤¶ÈÊÇ
FMNAMESZ+1£¬Ôö¼Ó1¸ö×Ö½ÚÊÇΪÁË´æ·ÅnullÖÕÖ¹·û¡£
Èç¹ûioctlµÄµÚ3¸ö²ÎÊýÊÇ0£¬Ôò¸Ãº¯Êý·µ»ØµÄÊÇÄ£¿éÊý£¬¶ø²»ÊÇÄ£¿éÃû¡£ÎÒÃǽ«ÏÈ
ÓÃÕâÖÖioctlµ÷ÓÃÈ·¶¨Ä£¿éÊý£¬È»ºóÔÙ·ÖÅäËùÒªÇóµÄstr_mlist½á¹¹Êý¡£
³ÌÐò12.10ÀýʾÁËI_LIST²Ù×÷¡£ÓÉioctl·µ»ØµÄÃû×ÖÁÐ±í²¢²»¶ÔÄ£¿éºÍÇý¶¯³ÌÐò½øÐÐ
Çø·Ö£¬ÒòΪÔÚ¸ÃÁбíÖеÄ×îºóÒ»ÏîÊÇ´¦ÓÚÁ÷µ×²¿µÄÇý¶¯³ÌÐò£¬ËùÒÔÔÚ´òӡʱ½«Æä±ê
Ã÷ΪÇý¶¯³ÌÐò¡£
#include <sys/conf.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stropts.h>
#include "ourhdr.h"
int
main(int argc, char *argv[])
{
int fd, i, nmods;
struct str_list list;
if (argc != 2)
err_quit("usage: a.out <pathname>");
if ( (fd = open(argv[1], O_RDONLY)) < 0)
err_sys("can't open %s", argv[1]);
if (isastream(fd) == 0)
err_quit("%s is not a stream", argv[1]);
/* fetch number of modules */
if ( (nmods = ioctl(fd, I_LIST, (void *) 0)) < 0)
err_sys("I_LIST error for nmods");
printf("#modules = %d\n", nmods);
/* allocate storage for all the module names */
list.sl_modlist = calloc(nmods, sizeof(struct str_mlist));
if (list.sl_modlist == NULL)
err_sys("calloc error");
list.sl_nmods = nmods;
/* and fetch the module names */
if (ioctl(fd, I_LIST, &list) < 0)
err_sys("I_LIST error for list");
/* print the module names */
for (i = 1; i <= nmods; i++)
printf(" %s: %s\n", (i == nmods) ? "driver" : "module",
list.sl_modlist++);
exit(0);
}
³ÌÐò12.10 ´òÓ¡Á÷ÖеÄÄ£¿éÃû
$ who
stevens console sep 25 06:12
stevens pts001 Oct 12 07:12
$ a.out /dev/pts001
#modules=4
module:ttcompat
module:ldterm
module:ptem
driver:pts
$ a.out /dev/console
#modules=5
module:ttcompat
module:ldterm
module:ansi
module:char
driver:cmux
ÔÚÕâÁ½ÖÖÇéÐÎÖУ¬¶¥ÉϵÄÁ½¸öÁ÷Ä£¿é¶¼ÊÇÒ»ÑùµÄ£¨ttcompacºÍldterm£©£¬µ«ÊÇÓàÏÂ
µÄÄ£¿éºÍÇý¶¯³ÌÐòÔò²»Í¬¡£ÔÚµÚÊ®¾ÅÕÂÖÐÎÒÃǽ«ËµÃ÷αÖÕ¶ËÇéÐΡ£
writeÖÁÁ÷É豸
ÔÚͼ12.10ÖпÉÒÔ¿´µ½writeÖÁÁ÷É豸²úÉúÒ»¸öM_DATAÏûÏ¢¡£Ò»°ã¶øÑÔ£¬ÕâȷʵÈç´Ë
£¬µ«ÊÇÒ²»¹ÓÐһЩÇé¿öÐèÒª¿¼ÂÇ¡£Ê×ÏÈ£¬Á÷Öж¥²¿µÄÒ»¸ö´¦ÀíÄ£¿é¹æ¶¨ÁË¿É˳Á÷´«
Ë͵Ä×îС¡¢×î´óÊý¾Ý°ü³¤¶È¡££¨ÎÞ·¨²éѯ¸ÃÄ£¿éÖй涨µÄÕâЩֵ¡££©Èç¹ûwriteµÄ
Êý¾Ý³¤¶È³¬¹ý×î´óÖµ£¬ÔòÁ÷Ê×½«ÕâÒ»Êý¾Ý·Ö½â³É×î´ó³¤¶ÈµÄÈô¸ÉÊý¾Ý°ü¡£×îºóÒ»¸ö
Êý¾Ý°üµÄ³¤¶ÈÔòСÓÚ×î´óÖµ¡£
½Ó×ÅÒª¿¼ÂǵÄÊÇ£ºÈç¹ûÏòÁ÷write 0¸ö×Ö½Ú£¬ÓÖ½«ÈçºÎÄØ£¿³ý·ÇÁ÷Éæ¼°¹ÜµÀ»òFIFO
£¬·ñÔò¾Í˳Á÷·¢ËÍ0³¤ÏûÏ¢¡£¶ÔÓڹܵÀFIFO£¬ÎªÓëÒÔǰ°æ±¾¼æÈÝ£¬ÏµÍ³µÄĬÈÏ´¦Àí
·½Ê½ÊǺöÂÔ0³¤write¡£¿ÉÒÔÓÃioctlÉèÖÃʵÏֹܵÀºÍFIFOµÄÁ÷д·½Ê½ÒÔ¸ü¸ÄÕâÖÖĬ
ÈÏ´¦Àí·½Ê½¡£
д·½Ê½
¿ÉÒÔÓÃioctlÈ¡µÃºÍÉèÖÃÒ»¸öÁ÷µÄд·½Ê½¡£Èç¹û½«requestÉèÖÃΪI_GWROPT£¬µÚÈý¸ö
²ÎÊýΪָÏòÒ»¸öÕûÐͱäÁ¿µÄÖ¸Õë,Ôò¸ÃÁ÷µÄµ±Ç°Ð´·½Ê½¾ÍÔÚ¸ÃÕûÐÍÁ¿Öзµ»Ø¡£Èç¹û
½«requestÉèÖÃΪI_SWROPT,µÚ3¸ö²ÎÊýÊÇÒ»¸öÕûÐÍ,ÔòÆäÖµ¾Í³ÉΪ¸ÃÁ÷еÄд·½Ê½¡£
Èçͬ´¦ÀíÎļþÃèÊö·û±êÖ¾ºÍÎļþ״̬±êÖ¾(3.13½Ú)Ò»Ñù,×ÜÊÇÓ¦µ±ÏÈÈ¡µ±Ç°Ð´·½Ê½
Öµ,È»ºóÐÞ¸ÄËü,¶ø²»Ö»Êǽ«Ð´·½Ê½ÉèÖÃΪij¸ö¾ø¶ÔÖµ(ºÜ¿ÉÄÜÒª¹Ø±ÕijЩÔÀ´´ò¿ª
µÄλ)¡£
Ŀǰ£¬Ö»¶¨ÒåÁËÁ½¸öд·½Ê½Öµ¡£
SNDZERO ¶Ô¹ÜµÀºÍFIFOµÄ0³¤Ð´»áÔì³É˳Á÷´«ËÍÒ»¸ö0³¤ÏûÏ¢¡£°´ÏµÍ³Ä¬ÈÏ£¬0³¤Ð´
²»·¢ËÍÏûÏ¢¡£
SNPIPE ÔÚÁ÷ÉÏÒѳö´íºó£¬Èôµ÷ÓÃwrite»òputmsg£¬ÔòÏòµ÷Óýø³Ì·¢ËÍSIGPIPEÐÅ
ºÅ¡£
Ò»¸öÁ÷Ò²ÓжÁ·½Ê½£¬ÎÒÃÇÏÈ˵Ã÷getmsgºÍgetpmsgº¯Êý£¬È»ºóÔÙ˵Ã÷¶Á·½Ê½¡£
_______________________________________________________________________
____
#include <stropts.h>
int getmsg(int filedes,struct strbuf *ctlptr,
struct strbuf *dataptr,int *flagptr);
int getpmsg(int filedes,struct strbuf *ctlptr,
struct strbuf *dataptr, int *bandptr, int *flagptr);
Á½¸öº¯Êý·µ»Ø£ºÈô³É¹¦Îª·Ç¸ºÖµ£¬³ö´íΪ-1
_____________________________________________________________________
________
getmsgºÍgetpmsgº¯Êý
ÓÃread£¬getmsgºÍgetpmsg´ÓÁ÷Ê×¶ÁÁ÷ÏûÏ¢¡£
×¢Ò⣬flagptrºÍbandptrÊÇÖ¸ÏòÕûÐ͵ÄÖ¸Õë¡£ÔÚµ÷ÓÃ֮ǰ£¬ÕâÁ½¸öÖ¸ÕëËùÖ¸ÏòµÄÕû
Ð͵¥ÔªÖÐÓ¦ÉèÖóÉËùÏ£ÍûµÄÏûÏ¢ÀàÐÍ£¬ÔÚ·µ»ØÊ±£¬´ËÕûÐÍÁ¿ÉèÖÃΪËù¶Áµ½µÄÏûÏ¢µÄ
ÀàÐÍ¡£
Èç¹ûflagptrÖ¸ÏòµÄÕûÐ͵¥ÔªµÄÖµÊÇ0£¬Ôògetmsg·µ»ØÔÚÁ÷Ê×¶Á¶ÓÁÐÖеÄÏÂÒ»¸öÏûÏ¢
¡£Èç¹ûÏÂÒ»¸öÏûÏ¢ÊǸßÓÅÏÈȨÏûÏ¢£¬ÔòÔÚ·µ»ØÊ±£¬flagptrËùÖ¸ÏòµÄÕûÐ͵¥ÔªÉèÖÃ
ΪRS_HIPRI¡£Èç¹ûÏ£ÍûÖ»½ÓÊÕ¸ßÓÅÏÈȨÏûÏ¢£¬ÔòÔÚµ÷ÓÃgetmsg֮ǰ±ØÐ뽫flagptr
ËùÖ¸ÏòµÄÕûÐ͵¥ÔªÉèÖÃΪRS_HIPRI¡£
ÕâÁ½¸öº¯ÊýÓкܶàÌõ¼þÀ´È·¶¨·µ»Ø¸øµ÷ÓÃÕߺÎÖÖÏûÏ¢£º(a)flagptrºÍbandptrËùÖ¸
ÏòµÄÖµ£¬(b)ctlptr->maxlenºÍdataptr->maxlenµÄÖµ¡£¶ÔʹÓÃgetmsg¶øÑÔ£¬²¢²»Ðè
ÒªÁ˽âËùÓÐÕâЩϸ½Ú¡£ÈçÓûÁ˽âÕâЩϸ½ÚÇë²ÎÔÄgetmsg£¨2£©ÊÖ²áÒ³¡£
¶Á·½Ê½
Èç¹ûreadÁ÷É豸»á·¢ÉúÐ©Ê²Ã´ÄØ£¿ÓÐÁ½¸öDZÔÚµÄÎÊÌ⣺(1)Èç¹û¶Áµ½Á÷ÖÐÏûÏ¢µÄ¼Ç
¼±ß½ç½«»áÔõÑù£¿(2)Èç¹ûµ÷ÓÃread£¬¶øÁ÷ÖÐÏÂÒ»¸öÏûÏ¢ÓпØÖÆÐÅÏ¢ÓÖ½«ÈçºÎ£¿¶Ô
µÚÒ»ÖÖÇé¿öµÄĬÈÏ´¦Àí·½Ê½±»³ÆÎª×Ö½ÚÁ÷·½Ê½¡£ÔÚÕâÖÖ·½Ê½ÖУ¬read´ÓÁ÷ÖÐÈ¡Êý¾Ý
Ö±ÖÁÂú×ãÁËÒªÇ󣬻òÕßÒѾûÓÐÊý¾Ý¡£ÔÚÕâÖÖ·½Ê½ÖУ¬ºöÂÔÁ÷ÖÐÏûÏ¢µÄ±ß½ç¡£¶ÔµÚ
¶þÖÖÇé¿öµÄĬÈÏ´¦ÀíÊÇ£¬Èç¹ûÔÚ¶ÓÁеÄǰ¶ËÓпØÖÆÏûÏ¢£¬Ôòread³ö´í·µ»Ø¡£¿ÉÒÔ¸Ä
±äÕâÁ½ÖÖĬÈÏ´¦Àí·½Ê½¡£
ÔÚµ÷ÓÃioctlʱ£¬Èô½«requestÉèÖÃΪI_GRDOPT£¬µÚ3¸ö²ÎÊýÓÖÊÇÖ¸ÏòÒ»¸öÕûÐ͵¥Ôª
µÄÖ¸Õ룬Ôò¶Ô¸ÃÁ÷µÄµ±Ç°¶Á·½Ê½ÔÚ¸ÃÕûÐ͵¥ÔªÖзµ»Ø¡£Èç¹û½«requestÉèÖÃΪI_SR
DOPT£¬µÚ3¸ö²ÎÊýÊÇÕûÐÍÖµ£¬Ôò¸ÃÁ÷µÄ¶Á·½Ê½ÉèÖÃΪ¸ÃÖµ¡£¶Á·½Ê½ÖµÓÐÏÂÁÐÈý¸ö£º
RNORM ÆÕͨ£¬×Ö½ÚÁ÷·½Ê½£¨ÓëÉÏÃæËµÃ÷µÄÏàͬ£©¡£ÕâÊÇĬÈÏ·½Ê½¡£
RMSGN ÏûÏ¢²»É¾³ý·½Ê½¡£¶Á´ÓÁ÷ÖÐÈ¡Êý¾ÝÖ±ÖÁ¶Áµ½ËùÒªÇóµÄ×Ö½ÚÊý£¬»òÕßµ½´ïÏû
Ï¢±ß½ç¡£Èç¹ûij´Î¶ÁÖ»ÓÃÁËÒ»¸öÏûÏ¢µÄÒ»²¿·Ö£¬ÔòÆäÓàϲ¿·ÖÈÔÁôÔÚÁ÷ÖУ¬ÒÔ¹©ÏÂ
Ò»¸ö¶ÁÈ¡¡£
RMSGD ÏûϢɾ³ý·½Ê½¡£ÕâÓ벻ɾ³ý·½Ê½µÄÇø±ðÊÇ£¬Èç¹ûij´Î¶ÁÖ»ÓÃÒ»¸öÏûÏ¢µÄÒ»
²¿·Ö¡£ÔòÓàϲ¿·Ö¾Í±»É¾³ý£¬²»ÔÙʹÓá£
ÔÚ¶Á·½Ê½Öл¹¿ÉÖ¸¶¨ÁíÍâÈý¸ö³£Êý£¬ÒÔ±ãÉèÖÃÔÚ¶Áµ½Á÷Öаüº¬ÐÒéÐÅÏ¢µÄÏûϢʱr
eadµÄ´¦Àí·½·¨£º
RPROTNORM ÐÒé-ÆÕͨ·½Ê½£ºread³ö´í·µ»Ø£¬errnoÉèÖÃΪEBADMSG¡£ÕâÊÇĬÈÏ·½Ê½
¡£
RPROTDAT ÐÒé-Êý¾Ý·½Ê½£ºread½«¿ØÖƲ¿·Ö×÷ΪÊý¾Ý·µ»Ø¸øµ÷ÓÃÕß¡£
RPROTDIS ÐÒé-ɾ³ý·½Ê½£ºreadɾ³ýÏûÏ¢ÖеĿØÖÆÐÅÏ¢£¬µ«ÊÇ·µ»ØÏûÏ¢ÖеÄÊý
¾Ý¡£
ʵÀý
³ÌÐò12.11ÊÇÔÚ³ÌÐò3.3µÄ»ù´¡ÉϸÄдµÄ£¬ËüÓÃgetmsg´úÌæÁËread¡£Èç¹ûÔÚSVR4Ö®ÏÂ
£¨Æä¹ÜµÀºÍÖն˶¼ÊÇÓÃÁ÷ʵÏֵģ©ÔËÐд˳ÌÐòÔòµÃ£º
$ echo hello,world | a.out requires pipes to be implemented usi
ng streams
flag=0,ctl.len=-1,dat.len=13
hello,world
flag=0,ctl.len=0,dat.len=0 indicates a streams hangup
$ a.out requires terminals to be implemented using streams
this is line 1
flag=0,ctl.len=-1,dat.len=15
this is line 1
and line 2
flag=0,ctl.len=-1,dat.len=11
and line 2
^D type our terminal EOF character
flag=0,ctl.len=-1,dat.len=0 tty end of file is not the same as a hang
up
$ a.out < /etc/motd
getmsg error:Not a stream device
µ±¹ÜµÀ±»¹Ø±Õʱ£¨µ±echoÖÕֹʱ£©£¬Ëü¶Ô³ÌÐò12.11±íÏÖΪһ¸öÁ÷¹Ò¶Ï-¿ØÖƳ¤¶ÈºÍ
Êý¾Ý³¤¶È¶¼ÉèÖÃΪ0¡££¨ÔÚ14.2½ÚÖн«ÌÖÂ۹ܵÀ¡££©µ«ÊǶÔÓÚÖÕ¶Ë£¬¼üÈëÎļþ½áÊø
×Ö·û£¬Ö»Ê¹·µ»ØµÄÊý¾Ý³¤¶ÈΪ0¡£ÕâÓë¹Ò¶Ï²¢²»Ïàͬ¡£ÈçËùÔ¤ÁϵÄÒ»Ñù£¬½«±ê×¼Êä
ÈëÖØÐ¶¨Ïòµ½Ò»¸ö·ÇÁ÷É豸£¬getmsg³ö´í·µ»Ø¡£
#include <stropts.h>
#include "ourhdr.h"
#define BUFFSIZE 8192
int
main(void)
{
int n, flag;
char ctlbuf[BUFFSIZE], datbuf[BUFFSIZE];
struct strbuf ctl, dat;
ctl.buf = ctlbuf;
ctl.maxlen = BUFFSIZE;
dat.buf = datbuf;
dat.maxlen = BUFFSIZE;
for ( ; ; ) {
flag = 0; /* return any message */
if ( (n = getmsg(STDIN_FILENO, &ctl, &dat, &flag)) < 0)
err_sys("getmsg error");
fprintf(stderr, "flag = %d, ctl.len = %d, dat.len = %d\n",
flag, ctl.len, dat.len);
if (dat.len == 0)
exit(0);
else if (dat.len > 0)
if (write(STDOUT_FILENO, dat.buf, dat.len) != dat.len)
err_sys("write error");
}
}
³ÌÐò12.11 ÓÃgetmsg½«±ê×¼ÊäÈë¸´ÖÆµ½±ê×¼Êä³ö
12.4 I/O¶à·ת½Ó
µ±´ÓÒ»¸öÃèÊö·û¶Á£¬È»ºóÓÖдµ½ÁíÒ»¸öÃèÊö·ûʱ£¬ÎÒÃÇ¿ÉÒÔÔÚÏÂÁÐÐÎʽµÄÑ»·ÖÐʹ
ÓÃ×èÈûI/O£º
while ( (n=read(STDIN_FILENO,buf,BUFSIZ) ) >0)
if (write (STDOUT_FILENO,buf,n) !=n)
err_sys (write error");
ʹÓÃÕâÖÖÐÎʽµÄ×èÈûI/OÊǵ½´¦¿É¼ûµÄ¡£µ«ÊÇÈçÈô±ØÐë¶ÁÁ½¸öÃèÊö·ûÓÖ½«ÈçºÎÄØ£¿
Èç¹ûÎÒÃÇÈÔ¾ÉʹÓÃ×èÈûI/O£¬ÄÇô¾Í¿ÉÄܳ¤Ê±¼ä×èÈûÔÚÒ»¸öÃèÊö·ûÉÏ£¬¶øÁíÒ»¸öÃè
Êö·ûËäÓкܶàÊý¾ÝÈ´²»Äܵõ½¼°Ê±´¦Àí¡£ËùÒÔΪÁË´¦ÀíÕâÖÖÇé¿öÏÔÈ»ÐèÒªÁíÒ»ÖÖ²»
ͬµÄ¼¼Êõ¡£
ÈÃÎÒÃǸÅÂԵع۲ìÒ»¸öµ÷ÖÆ½âµ÷Æ÷²¦ºÅ³ÌÐòµÄ¹¤×÷Çé¿ö£¨¸Ã³ÌÐò½«ÔÚµÚÊ®°ËÕÂÖнé
ÉÜ£©¡£¸Ã³ÌÐò¶ÁÖÕ¶Ë£¨±ê×¼ÊäÈ룩£¬½«ËùµÃÊý¾Ýдµ½µ÷ÖÆ½âµ÷Æ÷ÉÏ£»Í¬Ê±¶Áµ÷ÖÆ½â
µ÷Æ÷£¬½«ËùµÃÊý¾Ýдµ½ÖÕ¶ËÉÏ£¨±ê×¼Êä³ö£©¡£Í¼12.11ÏÔʾÕâÖÖ¹¤×÷Çé¿ö¡£
ͼ12.11 µ÷ÖÆ½âµ÷Æ÷²¦ºÅ³ÌÐò¸Å¹Û
Ö´ÐÐÕâ¶Î³ÌÐòµÄ½ø³ÌÓÐÁ½¸öÊäÈ룬Á½¸öÊä³ö¡£Èç¹û¶ÔÕâÁ½¸öÊäÈ붼ʹÓÃ×èÈûread£¬
ÄÇô¾Í¿ÉÄÜÔÚÒ»¸öÊäÈëÉϳ¤ÆÚ×èÈû£¬¶øÁíÒ»¸öÊäÈëµÄÊý¾ÝÔò±»¶ªÊ§¡£
´¦ÀíÕâÖÖÌØÊâÎÊÌâµÄÒ»ÖÖ·½·¨ÊÇ£ºÉèÖÃÁ½¸ö½ø³Ì£¬Ã¿¸ö½ø³Ì´¦ÀíÒ»ÌõÊý¾Ýͨ·¡£ÔÚ
ͼ12.12ÖÐÏÔʾÁËÕâÖÖ°²ÅÅ¡£
ͼ12.12 ʹÓÃÁ½¸ö½ø³ÌʵÏÖµ÷ÖÆ½âµ÷Æ÷²¦ºÅ³ÌÐò
Èç¹ûʹÓÃÁ½¸ö½ø³Ì£¬Ôò¿Éʹÿ¸ö½ø³Ì¶¼Ö´ÐÐ×èÈûread¡£µ«ÊÇÒ²²úÉúÁËÕâ¶þ¸ö½ø³Ì¼ä
Ï໥ÅäºÏÎÊÌâ¡£Èç¹û×Ó½ø³Ì½ÓÊÕµ½Îļþ½áÊø·û£¨ÓÉÓڵ绰ÏßµÄÒ»¶ËÒѾ¹Ò¶Ï£¬Ê¹µ÷
ÖÆ½âµ÷Æ÷Ò²¹Ò¶Ï£©£¬ÄÇô¸Ã×Ó½ø³ÌÖÕÖ¹£¬È»ºó¸¸½ø³Ì½ÓÊÕµ½SIGCHLDÐźš£µ«ÊÇ£¬
ÈçÈô¸¸½ø³ÌÖÕÖ¹£¨Óû§ÔÚÖÕ¶ËÉϼüÈëÁËÎļþ½áÊø·û£©£¬ÄÇô¸¸½ø³ÌӦ֪ͨ×Ó½ø³ÌÍ£
Ö¹¹¤×÷¡£Îª´ËÎÒÃÇ¿ÉÒÔʹÓÃÒ»¸öÐźţ¨ÀýÈ磬SIGUSR1£©¡£Õâʹ³ÌÐò±äµÃ¸ü¼Ó¸´ÔÓ
¡£
ÁíÒ»¸ö·½Ê½ÊÇÈÔ¾ÉʹÓÃÒ»¸ö½ø³ÌÖ´ÐиóÌÐò£¬µ«µ÷Ó÷Ç×èÈûI/O¶ÁÈ¡Êý¾Ý£¬Æä»ù±¾
˼ÏëÊÇ£º½«Á½¸öÊäÈëÃèÊö·û¶¼ÉèÖÃΪ·Ç×èÈûµÄ£¬¶ÔµÚÒ»¸öÃèÊö·û·¢Ò»¸öread¡£Èç¹û
¸ÃÊäÈëÉÏÓÐÊý¾Ý£¬Ôò¶ÁÊý¾Ý²¢´¦ÀíËü¡£Èç¹ûÎÞÊý¾Ý¿É¶Á£¬ÔòreadÁ¢¼´·µ»Ø¡£È»ºó¶Ô
µÚ¶þ¸öÃèÊö·û×÷ÓÃÑùµÄ´¦Àí¡£ÔÚ´ËÖ®ºó£¬µÈ´ýÈô¸ÉÃëÔÙ¶ÁµÚÒ»¸öÃèÊö·û¡£ÕâÖÖÐÎʽ
µÄÑ»·³ÆÎªÂÖѯ¡£ÕâÖÖ·½·¨µÄ²»×ãÖ®´¦ÊÇÀË·ÑCPUʱ¼ä¡£´ó¶àÊýʱ¼äʵ¼ÊÉÏÊÇÎÞÊý
¾Ý¿É¶Á£¬µ«ÊÇÈÔ²»¶Ï·´¸´Ö´ÐÐread£¬ÕâÀË·ÑÁËCPUʱ¼ä¡£ÔÚÿ´ÎÑ»·ºóÒªµÈ¶à³¤Ê±
¼äÔÙÖ´ÐÐÏÂÒ»ÂÖÑ»·Ò²ÊǺÜÄÑÈ·¶¨µÄ¡£ÂÖѯ¼¼ÊõÔÚÖ§³Ö·Ç×èÈûI/OµÄϵͳÉ϶¼¿Éʹ
Ó㬵«ÊÇÔÚ¶àÈÎÎñϵͳÖÐÓ¦µ±±ÜÃâʹÓá£
»¹ÓÐÒ»ÖÖ¼¼Êõ³ÆÖ®ÎªÒì²½I/O¡£Æä»ù±¾Ë¼ÏëÊǽø³Ì¸æËßϵͳºË£¬µ±Ò»¸öÃèÊö·ûÒÑ×¼
±¸ºÃ¿ÉÒÔ½øÐÐI/Oʱ£¬ÓÃÒ»¸öÐźÅ֪ͨËü¡£ÕâÖÖ¼¼ÊõÓÐÁ½¸öÎÊÌâ¡£µÚÒ»¸öÊDz¢·ÇËù
ÓÐϵͳ¶¼Ö§³ÖÕâÖÖ»úÖÆ£¨ÏÖÔÚËü»¹²»ÊÇPOSIXµÄ×é³É²¿·Ö£¬¿ÉÄܽ«À´»áÊÇ£©¡£SVR4
Ϊ´Ë¼¼ÊõÌṩSIGPOLLÐźţ¬µ«Êǽöµ±ÃèÊö·ûÒýÓÃÁ÷É豸ʱ£¬´ËÐźŲÅÄܹ¤×÷¡£4.
3+BSDÓÐÒ»¸öÀàËÆµÄÐźÅSIGIO£¬µ«Ò²ÓÐÀàËÆµÄÏÞÖÆ-½öµ±ÃèÊö·ûÒýÓÃÖÕ¶ËÉ豸»òÍø
Âçʱ²ÅÄܹ¤×÷¡£ÕâÖÖ¼¼ÊõµÄµÚ¶þ¸öÎÊÌâÊÇ£¬ÕâÖÖÐźŶÔÿ¸ö½ø³Ì¶øÑÔÖ»ÓÐ1¸ö¡£Èç
¹ûʹ¸ÃÐźŶÔÁ½¸öÃèÊö·û¶¼Æð×÷Óã¬ÄÇôÔÚ½Óµ½´ËÐźÅʱ½ø³ÌÎÞ·¨ÅбðÊÇÄÄÒ»¸öÃè
Êö·ûÒÑ×¼±¸ºÃ¿ÉÒÔ½øÐÐI/O¡£ÎªÁËÈ·¶¨ÊÇÄÄÒ»¸öÃèÊö·ûÒÑ×¼±¸ºÃ£¬ÈÔÐ轫ÕâÁ½¸öÃè
Êö·û¶¼ÉèÖÃΪ·Ç×èÈûµÄ£¬²¢Ë³ÐòÊÔÖ´ÐÐI/O¡£ÔÚ12.6½ÚÖн«¼òҪ˵Ã÷Òì²½I/O¡£
Ò»ÖֱȽϺõļ¼ÊõÊÇʹÓÃI/O¶à·ת½Ó¡£Æä»ù±¾Ë¼ÏëÊÇ£ºÏȹ¹ÔìÒ»ÕÅÓйØÃèÊö·ûµÄ
±í£¬È»ºóµ÷ÓÃÒ»¸öº¯Êý£¬ËüÒªµ½ÕâЩÃèÊö·ûÖеÄÒ»¸öÒÑ×¼±¸ºÃ½øÐÐI/Oʱ²Å·µ»Ø¡£
ÔÚ·µ»ØÊ±£¬Ëü¸æËß½ø³ÌÄÇÒ»¸öÃèÊö·ûÒÑ×¼±¸ºÃ¿ÉÒÔ½øÐÐI/O¡£
I/O¶à·ת½ÓÖÁ½ñ»¹²»ÊÇPOSIXµÄ×é³É²¿·Ö¡£SVR4ºÍ4.3+BSD¶¼Ìṩselect
º¯ÊýÒÔÖ´ÐÐI/O¶à·ת½Ó¡£pollº¯ÊýÖ»ÓÉSVR4Ìṩ¡£SVR4ʵ¼ÊÉÏÓÃpollʵÏÖselect
¡£
I/O¶à·ת½ÓÔÚ4.2+BSDÖÐÊÇÓÃselectº¯ÊýÌṩµÄ¡£ËäÈ»¸Ãº¯ÊýÖ÷ÒªÓÃÓÚÖÕ
¶ËI/OºÍÍøÂçI/O£¬µ«Ëü¶ÔÆäËüÃèÊö·ûͬÑùÊÇÆð×÷Óõġ£SVR3ÔÚÔö¼ÓÁ÷»úÖÆÊ±Ôö¼ÓÁË
pollº¯Êý¡£µ«ÔÚSVR4֮ǰ£¬pollÖ»¶ÔÁ÷É豸Æð×÷Óá£SVR4Ö§³Ö¶ÔÈÎÒ»ÃèÊö·ûÆð×÷ÓÃ
µÄpoll¡£
selectºÍpollµÄ¿ÉÖжÏÐÔ
ÖжϵÄϵͳµ÷ÓõÄ×Ô¶¯ÔÙÆð¶¯ÊÇÓÉ4.2+BSDÒý½øµÄ£¨10.5½Ú£©£¬µ«µ±Ê±select
º¯ÊýÊDz»
ÔÙÆð¶¯µÄ¡£ÕâÖÖÌØÐÔÑÓÐøµ½4.3+BSD£¬¼´Ê¹Ö¸¶¨ÁËSA_RESTARTÒ²ÊÇΪ´Ë¡£µ«ÊÇ£¬ÔÚ
SVR4֮ϣ¬Èç¹ûÖ¸¶¨ÁËSA_RESTART£¬ÄÇôselectºÍpollÒ²ÊÇ×Ô¶¯ÔÙÆð¶¯µÄ¡£ÎªÁ˽«
Èí¼þÒÆÖ²µ½SVR4ʱ×èÖ¹ÕâÒ»µã£¬Èç¹ûÐźſÉÄÜÖжÏselect»òpoll£¬Ôò×ÜÊÇʹÓÃsig
nal_intrº¯Êý£¨³ÌÐò10.13£©¡£
12.4.1 selectº¯Êý
selectº¯ÊýʹÎÒÃÇÔÚSVR4ºÍ4.3+BSD֮ϿÉÒÔÖ´ÐÐI/O¶à·ת½Ó£¬´«ÏòselectµÄ²ÎÊý
¸æËßϵͳºË£º
1. ÎÒÃÇËù¹ØÐĵÄÃèÊö·û¡£
2. ¶Ôÿ¸öÃèÊö·ûÎÒÃÇËù¹ØÐĵÄÌõ¼þ¡££¨ÎÒÃÇÊÇ·ñ¶ÁÒ»¸ö¸ø¶¨µÄÃèÊö·û£¿ÊÇ·ñÏëд
Ò»¸ö¸ø¶¨µÄÃèÊö·û£¿ÊÇ·ñ¹ØÐÄÒ»¸öÃèÊö·ûµÄÒì³£Ìõ¼þ£¿£©
3. Ï£ÍûµÈ´ý¶à³¤Ê±¼ä¡££¨¿ÉÒÔÓÀÔ¶µÈ´ý£¬µÈ´ýÒ»¸ö¹Ì¶¨Á¿Ê±¼ä£¬»òÍêÈ«²»µÈ´ý£©
´Óselect·µ»ØÊ±£¬ÏµÍ³ºË¸æËßÎÒÃÇ£º
1. ÒÑ×¼±¸ºÃµÄÃèÊö·ûµÄÊýÁ¿¡£
2. ÄÄÒ»¸öÃèÊö·ûÒÑ×¼±¸ºÃ¶Á»òд¡¢»òÒì³£Ìõ¼þ¡£
ʹÓÃÕâÖÖ·µ»ØÖµ£¬ÎÒÃǾͿɵ÷ÓÃÏàÓ¦µÄI/Oº¯Êý£¨Ò»°ãÊÇread»òwrite£©£¬²¢ÇÒÈ·Öª
¸Ãº¯Êý²»»á×èÈû¡£
_______________________________________________________________________
_______
#include <sys/types.h> fd_setÊý¾ÝÀàÐÍ
#include <sys/time.h> timeval½á¹¹
#include <unistd.h> º¯ÊýÔÐÎ
int select (int maxfdp1,fd_set *readfds,fd_set *writefds,fd_set *except
fds,
struct timeval * tvptr);
·µ»Ø£º×¼±¸¾ÍÐ÷µÄÃèÊö·ûÊý£¬Èô³¬Ê±Îª0£¬³ö´íΪ-1
_______________________________________________________________________
_______
ÏÈ˵Ã÷×îºóÒ»¸ö²ÎÊý£¬ËüÖ¸¶¨Ô¸ÒâµÈ´ýµÄʱ¼ä¡£
struct timeval{
long tv_sec; /*Ãë*/
long tv_usec; /*ÒÔ¼°Î¢Ãë*/
}£»
ÓÐÈýÖÖÇé¿ö£º
tvptr= =NULL
ÓÀÔ¶µÈ´ý¡£Èç¹û²¶×½µ½Ò»¸öÐźÅÔòÖжϴËÎÞÏÞÆÚµÈ´ý¡£µ±ËùÖ¸¶¨µÄÃèÊö·ûÖеÄÒ»
¸öÒÑ×¼±¸ºÃ»ò²¶×½µ½Ò»¸öÐźÅÔò·µ»Ø¡£Èç¹û²¶×½µ½Ò»¸öÐźţ¬Ôòselect·µ»Ø-1£¬
errnoÉèÖÃΪEINTR¡£
tvptr->tv_sec= =0 && tvptr->tv_usec= =0
ÍêÈ«²»µÈ´ý¡£²âÊÔËùÓÐÖ¸¶¨µÄÃèÊö·û²¢Á¢¼´·µ»Ø¡£ÕâÊǵõ½¶à¸öÃèÊö·ûµÄ״̬¶ø
²»×èÈûselectº¯ÊýµÄÂÖѯ·½·¨¡£
tvptr->tv_sec ! =0 | | tvptr->tv_usec! =0
µÈ´ýÖ¸¶¨µÄÃëÊýºÍ΢ÃëÊý¡£µ±Ö¸¶¨µÄÃèÊö·ûÖ®Ò»ÒÑ×¼±¸ºÃ£¬»òµ±Ö¸¶¨µÄʱ¼äÖµÒÑ
¾³¬¹ýʱÁ¢¼´·µ»Ø¡£Èç¹ûÔÚ³¬Ê±Ê±»¹Ã»ÓÐÒ»¸öÃèÊö·û×¼±¸ºÃ£¬Ôò·µ»ØÖµÊÇ0£¬£¨Èç
¹ûϵͳ²»Ìṩ΢Ãë·Ö±æÂÊ£¬Ôòtvptr->tv_usecֵȡÕûµ½×î½üµÄÖ§³ÖÖµ¡££©ÓëµÚÒ»ÖÖ
Çé¿öÒ»Ñù£¬ÕâÖֵȴý¿É±»²¶×½µ½µÄÐźÅÖжϡ£
ÖмäÈý¸ö²ÎÊýreadfds,writefdsºÍexceptfdsÊÇÖ¸ÏòÃèÊö·û¼¯µÄÖ¸Õë¡£ÕâÈý¸öÃèÊö
·û¼¯ËµÃ÷ÁËÎÒÃǹØÐĵĿɶÁ¡¢¿Éд»ò´¦ÓÚÒì³£Ìõ¼þµÄ¸÷¸öÃèÊö·ûÿ¸öÃèÊö·û¼¯´æ·Å
ÔÚÒ»¸öfd_setÊý¾ÝÀàÐÍÖС£ÕâÖÖÊý¾ÝÀàÐ͵ÄʵÏÖ¿ÉÈçͼ12.13ÖÐËùʾ£¬ËüΪÿһ¿É
ÄܵÄÃèÊö·û±£³ÖÁËһλ¡£
ͼ12.13 ¶ÔselectÖ¸¶¨¶Á¡¢Ð´ºÍÒì³£Ìõ¼þÃèÊö·û
¶Ôfg_setÊý¾ÝÀàÐÍ¿ÉÒÔ½øÐеĴ¦ÀíÊÇ£º(a)·ÖÅäÒ»¸öÕâÖÖÀàÐ͵ıäÁ¿£¬(b)½«ÕâÖÖÀà
Ð͵ÄÒ»¸ö±äÁ¿¸³ÓëͬÀàÐ͵ÄÁíÒ»¸ö±äÁ¿£¬»ò(c)¶ÔÓÚÕâÖÖÀàÐ͵ıäÁ¿Ê¹ÓÃÏÂÁÐËĸö
ºê£º
ÒÔÏÂÁз½Ê½ËµÃ÷ÁËÒ»¸öÃèÊö·û¼¯ºó£¬
fd_set rset;
int fd;
±ØÐëÓÃFD_ZEROÇå³ýÆäËùÓÐλ¡£
FD_ZERO (&rset);
È»ºóÔÚÆäÖÐÉèÖÃÎÒÃǹØÐĵĸ÷λ£º
FD_SET (fd,&rset);
FD_SET (STDIN_FILENO,&rset);
´Óselect·µ»ØÊ±£¬ÓÃFD_ISSET²âÊÔÔڸü¯ÖеÄÒ»¸ö¸ø¶¨Î»ÊÇ·ñÈÔ¾ÉÉèÖãº
if (FD_ISSET(fg,&rset)){
}¡¡
selectµÄÖмäÈý¸ö²ÎÊýÖеÄÈÎÒ»¸ö£¨»òÈ«²¿£©¿ÉÒÔÊÇ¿ÕÖ¸Õ룬Õâ±íʾ¶ÔÏàÓ¦Ìõ¼þ²¢
²»¹ØÐÄ¡£Èç¹ûËùÓÐÈý¸öÖ¸Õë¶¼ÊÇ¿ÕÖ¸Õ룬ÔòselectÌṩÁ˽Ïsleep¸ü¾«È·µÄ¼ÆÊ±Æ÷
£¨»ØÒä10.19½Ú£¬sleepµÈ´ýÕûÊýÃ룬¶ø¶ÔÓÚselect£¬ÆäµÈ´ýµÄʱ¼ä¿ÉÒÔСÓÚ1Ã룻
Æäʵ¼Ê·Ö±æÂÊÈ¡¾öÓÚϵͳʱÖÓ¡££©Á·Ï°12.6³öʾÁËÕâÑùÒ»¸öº¯Êý¡£
selectµÚÒ»¸ö²ÎÊýmaxfdp1µÄÒâ˼ÊÇ"×î´ófd¼Ó1"£¨maxfd plux 1£©¡£ÔÚÈý¸öÃèÊö·û
¼¯ÖÐÕÒ³ö×î¸ßÃèÊö·û±àºÅÖµ£¬È»ºó¼Ó1£¬Õâ¾ÍÊǵÚÒ»¸ö²ÎÊýÖµ¡£ÎÒÃÇÒ²¿É½«µÚÒ»¸ö
²ÎÊýÉèÖÃΪFD_SETSIZE£¬ÕâÊÇÒ»¸ö<sys/types.h>Öеij£Êý£¬Ëü˵Ã÷ÁË×î´óµÄÃèÊö
·ûÊý£¨¾³£ÊÇ256»ò1024£©¡£µ«ÊǶԴó¶àÊýÓ¦ÓóÌÐò¶øÑÔ£¬´ËÖµÊÇÌ«´óÁË¡£È·Êµ£¬
´ó¶àÊýÓ¦ÓóÌÐòÖ»Ó¦ÓÃ3-10¸öÃèÊö·û¡£Èç¹û½«µÚÈý¸ö²ÎÊýÉèÖÃΪ×î¸ßÃèÊö·û±àºÅÖµ
¼Ó1£¬ÏµÍ³ºË¾ÍÖ»ÐèÔÚ´Ë·¶Î§ÄÚѰÕÒ´ò¿ªµÄ룬¶ø²»±ØÔÚÊý°ÙλµÄ´ó·¶Î§ÄÚËÑË÷¡£
ÀýÈ磬Èô±àдÏÂÁдúÂ룺
fd_set readset,writeset;
FD_ZERO(&readset);
FD_ZERO(&writeset);
FD_SET(0,&readset);
FD_SET(3,&readset);
FD_SET(1,&writeset);
FD_SET(2,&writeset);
Select (4,&readset,&writeset,NULL,NULL);
È»ºó£¬Í¼12.14ÏÔʾÁËÕâÁ½¸öÃèÊö·û¼¯µÄÇé¿ö¡£
ͼ12.14 selectµÄÑù±¾ÃèÊö·û¼¯
ÒòΪÃèÊö·û±àºÅ´Ó0¿ªÊ¼£¬ËùÒÔÒªÔÚ×î´óÃèÊö·û±àºÅÖµÉϼÓ1¡£µÚÒ»¸ö²ÎÊýʵ¼ÊÉÏÊÇ
Òª¼ì²éµÄÃèÊö·ûÊý¡££¨´ÓÃèÊö·û0¿ªÊ¼¡££©
selectÓÐÈý¸ö¿ÉÄܵķµ»ØÖµ¡£
1. ·µ»ØÖµ-1±íʾ³ö´í¡£ÕâÊÇ¿ÉÄÜ·¢ÉúµÄ£¬ÀýÈçÔÚËùÖ¸¶¨µÄÃèÊö·û¶¼Ã»ÓÐ×¼±¸ºÃʱ
²¶×½µ½Ò»¸öÐźš£
2. ·µ»ØÖµ0±íʾûÓÐÃèÊö·û×¼±¸ºÃ¡£ÈôÖ¸¶¨µÄÃèÊö·û¶¼Ã»ÓÐ×¼±¸ºÃ£¬¶øÇÒÖ¸¶¨µÄʱ
¼äÒѾ³¬¹ý£¬Ôò·¢ÉúÕâÖÖÇé¿ö¡£
3. ·µ»ØÒ»¸öÕýÖµ£¬Ëü˵Ã÷ÁËÒѾ׼±¸ºÃµÄÃèÊö·ûÊý£¬ÔÚÕâÖÖÇé¿öÏ£¬ÔÚÈý¸öÃèÊö
·û¼¯ÖÐÈԾɴò¿ªµÄλÊǶÔÓ¦ÓÚÒÑ×¼±¸ºÃµÄÃèÊö·ûλ¡£
×¢Ò⣬³ý·Ç·µ»ØÕýÖµ£¬·ñÔòÔÚ·µ»Øºó¼ì²éÃèÊö·û¼¯ÊÇûÓÐÒâÒåµÄ¡£Èô²¶×½µ½ÐźŻò
¼ÆÊ±Æ÷³¬Ê±£¬ÄÇôÃèÊö·û¼¯µÄÖµÊÇÈ¡¾öÓÚʵÏֵġ£È·Êµ£¬Èô¼ÆÊ±Æ÷³¬Ê±£¬4.3+BSD
²¢²»¸Ä±äÃèÊö·û¼¯£¬¶øSVR4ÔòÇå³ýÃèÊö·û¼¯¡£
ÔÚSVR4ºÍBSDµÄselectʵÏÖÖ®¼ä£¬ÓÐÁíһЩ²îÒì¡£BSDϵͳ×ÜÊÇ·µ»ØÔÚÿһ¸ö¼¯ÖÐ×¼
±¸¾ÍÐ÷µÄÃèÊö·ûÊýÖ®ºÍ¡£ÈôÔÚÁ½¸ö¼¯ÖеÄͬһÃèÊö·ûÊÇ×¼±¸¾ÍÐ÷µÄ£¨ÀýÈ磬¶Á¼¯ºÍ
д¼¯£©£¬Ôò¸ÃÃèÊö·û¼ÆÁ½´Î¡£²»ÐÒ£¬SVR4¸ü¸ÄÁËÕâÒ»µã£¬ÈôͬһÃèÊö·ûÔÚ¶à¸ö¼¯ÖÐ
×¼±¸¾ÍÐ÷£¬¸ÃÃèÊö·ûÖ»¼ÆÒ»´Î¡£ÕâÔÙÒ»´ÎÏÔʾÁËÎÒÃǽ«»áÅöµ½µÄÎÊÌ⣬ֱÖÁPOSIX
±ê×¼»¯ÁËselectÕâÑùµÄº¯Êý²ÅÄܽâ¾ö´ËÎÊÌâ¡£
¶ÔÓÚ"×¼±¸ºÃ"µÄÒâ˼Ҫ×÷һЩ¸ü¾ßÌåµÄ˵Ã÷£º
1. Èô¶Ô¶Á¼¯£¨readfds£©ÖеÄÒ»¸öÃèÊö·ûµÄread²»»á×èÈû£¬Ôò´ËÃèÊö·ûÊÇ×¼±¸ºÃµÄ
¡£
2. Èô¶Ôд¼¯£¨writefds£©ÖеÄÒ»¸öÃèÊö·ûµÄwrite²»»á×èÈû£¬Ôò´ËÃèÊö·ûÊÇ×¼±¸ºÃ
µÄ¡£
3. Èô¶ÔÒì³£Ìõ¼þ¼¯£¨exceptfds£©ÖеÄÒ»¸öÃèÊö·ûÓÐÒ»¸öÄ©¾öÒì³£Ìõ¼þ£¬Ôò´ËÃèÊö
·ûÊÇ×¼±¸ºÃµÄ¡£ÏÖÔÚ£¬Òì³£Ìõ¼þ°üÀ¨£º(a)ÔÚÍøÂçÁ¬½ÓÉϵ½´ïÖ¸¶¨²¨ÌØÂÊÍâµÄÊý¾Ý
£¬»òÕß(b)ÔÚ´¦ÓÚÊý¾Ý°ü·½Ê½µÄαÖÕ¶ËÉÏ·¢ÉúÁËijЩÌõ¼þ¡££¨Stevens[1990]µÄ15.
10½ÚÖÐ˵Ã÷ÁËÕâÖÖÌõ¼þ¡££©
Ó¦µ±Àí½âÒ»¸öÃèÊö·û×èÈûÓë·ñ²¢²»Ó°ÏìselectÊÇ·ñ×èÈû¡£Ò²¾ÍÊÇ˵£¬Èç¹ûÎÒÃÇÏ£Íû
¶ÁÒ»¸ö·Ç×èÈûÃèÊö·û£¬²¢ÇÒÒÔ³¬Ê±ÖµÎª5Ãëµ÷ÓÃselect£¬Ôòselect×î¶à×èÈû5Ãë¡£Ïà
ÀàËÆ£¬Èç¹ûÖ¸¶¨Ò»¸öÎÞÏ޵ij¬Ê±Öµ£¬Ôòselect×èÈûµ½¶Ô¸ÃÃèÊö·ûÊý¾Ý×¼±¸ºÃ£¬»ò²¶
×½µ½Ò»¸öÐźš£
Èç¹ûÔÚÒ»¸öÃèÊö·ûÉÏÅöµ½ÁËÎļþ½áÊø£¬ÔòselectÈÏΪ¸ÃÃèÊö·ûÊǿɶÁµÄ¡£È»ºóÎÒÃÇ
µ÷ÓÃread£¬Ëü·µ»Ø0£¬ÕâÊÇUnixָʾµ½´ïÎļþ½áβ´¦µÄ·½·¨¡££¨ºÜ¶àÈË´íÎóµØÈÏΪ
£¬µ±µ½´ïÎļþ½áβ´¦Ê±£¬select»áָʾһ¸öÒì³£Ìõ¼þ¡££©
12.5.2 pollº¯Êý
SVR4µÄpollº¯ÊýÀàËÆÓÚselect£¬µ«ÊÇÆäµ÷ÓÃÐÎʽÔòÓÐËù²»Í¬¡£ÎÒÃǽ«»á¿´µ½£¬pol
lÓëÁ÷ϵͳ½ô½ôÏà¹Ø£¬ËäÈ»ÔÚSVR4ÖУ¬¿ÉÒÔ¶ÔÈÎÒ»ÃèÊö·û¶¼Ê¹Óøú¯Êý¡£
_______________________________________________________________________
______
#include <stropts.h>
#include <poll.h>
int poll(struct pollfd fdarray[],unsigned long nfds,int timeout);
·µ»Ø£º×¼±¸¾ÍÐ÷µÄÃèÊö·ûÊý£¬Èô³¬Ê±Îª0£¬³ö´íΪ-1
_______________________________________________________________________
______
Óëselect²»Í¬£¬poll²»ÊÇΪÿ¸öÌõ¼þ¹¹ÔìÒ»¸öÃèÊö·û¼¯£¬¶øÊǹ¹ÔìÒ»¸öpollfd½á¹¹
Êý×飬ÿ¸öÊý×éÔªËØÖ¸¶¨Ò»¸öÃèÊö·û±àºÅÒÔ¼°¶ÔÆäËù¹ØÐĵÄÌõ¼þ¡£
Struct pollfd{
int fd; Òª¼ì²éµÄÎļþÃèÊö·û£¬Èô<0ÔòºöÂÔ
short events; ¶Ôfd¸ÐÐËȤµÄÎļþ
short revents; ¶Ôfd ÒÑ·¢ÉúµÄÎļþ
};
fdarrayÊý×éÖеÄÔªËØÊýÓÉnfds˵Ã÷¡£
ÓÉÓÚijÖÖĩ֪µÄÔÒò£¬SVR3˵Ã÷nfdsµÄÀàÐÍΪunsigned long£¬ÕâËÆºõÊÇÌ«´óÁË¡£
ÔÚSVR4ÊÖ²áÖУ¬ÔÚpollµÄÔÐÍÖУ¬µÚ¶þ¸ö²ÎÊýµÄÊý¾ÝÀàÐÍΪsige_t£¬µ«ÔÚ<poll.h
£¾°üº¬µÄʵ¼ÊÔÐÍÖУ¬µÚ¶þ¸ö²ÎÊýµÄÊý¾ÝÀàÐÍÈÔ˵Ã÷Ϊunsigned long¡£
SVR4µÄSVID[AT&T1989]˵Ã÷pollµÄµÚÒ»¸ö²ÎÊýÊÇ£ºstruct pollfd fdarray[ ],¶ø
SVR4ÊÖ²áÒ³[AT&T 1990 d]Ôò˵Ã÷¸Ã²ÎÊýΪstruct pollfd *fdarray¡£ÔÚCÓïÑÔÖУ¬
ÕâÁ½ÖÖ˵Ã÷Êǵȼ۵ġ£ÎÒÃÇʹÓõÚÒ»ÖÖ˵Ã÷ÒÔÖØÉêfdarrayÖ¸ÏòÒ»¸ö½á¹¹Êý×飬¶ø
²»ÊÇÖ¸Ïòµ¥¸ö½á¹¹µÄÖ¸Õë¡£
Ó¦½«events³ÉÔ±ÉèÖÃΪͼ12.15ÖÐËùʾֵµÄÒ»¸ö»ò¼¸¸ö¡£Í¨¹ýÕâЩֵ¸æËßϵͳºËÎÒ
ÃǶԸÃÃèÊö·û¹ØÐĵÄÊÇʲô¡£ÔÚ·µ»ØÊ±£¬ÏµÍ³ºËÉèÖÃrevents³ÉÔ±£¬ÒÔ˵Ã÷¶Ô¸ÃÃè
Êö·û·¢ÉúÁËʲôʼþ¡££¨×¢Ò⣬pollûÓиü¸Äevents³ÉÔ±£¬ÕâÓëselect²»Í¬£¬sel
ectÐÞ¸ÄÆä²ÎÊýÒÔָʾÄÇÒ»¸öÃèÊö·ûÒÑ×¼±¸ºÃÁË¡££©
ͼ12.15 pollµÄeventsºÍrevents±êÖ¾
ͼ12.15ÖÐÍ·ËÄÐвâÊԿɶÁÐÔ£¬½Ó×ŵÄÈýÐвâÊÔ¿ÉдÐÔ£¬×îºóÈýÐÐÔòÊÇÒì³£Ìõ¼þ¡£
×îºóÈýÐÐÊÇÓÉϵͳºËÔÚ·µ»ØÊ±ÉèÖõġ£¼´Ê¹ÔÚevents×Ö¶ÎÖÐûÓÐÖ¸¶¨ÕâÈý¸öÖµ£¬Èç
¹ûÏàÓ¦Ìõ¼þ·¢Éú£¬ÔòÔÚreventsÖÐÒ²·µ»ØËüÃÇ¡£
µ±Ò»¸öÃèÊö·û±»¹Ò¶Ïºó£¨POLLHUP£©£¬¾Í²»ÄÜÔÙдÏò¸ÃÃèÊö·û¡£µ«ÊÇÈÔ¿ÉÄÜ´Ó¸ÃÃè
Êö·û¶ÁÈ¡µ½Êý¾Ý¡£
pollµÄ×îºóÒ»¸ö²ÎÊý˵Ã÷ÎÒÃÇÏëÒªµÈ´ý¶àÉÙʱ¼ä¡£ÈçͬselectÒ»Ñù£¬ÓÐÈýÖÖ²»Í¬µÄ
ÇéÐΣº
timeout= =INFTIM
ÓÀÔ¶µÈ´ý¡£³£ÊýINFTIM¶¨ÒåÔÚ<stropts.h>,Æäֵͨ³£ÊÇ-1¡£µ±ËùÖ¸¶¨µÄÃèÊö·ûÖеÄ
Ò»¸öÒÑ×¼±¸ºÃ£¬»ò²¶×½µ½Ò»¸öÐźÅÔò·µ»Ø¡£Èç¹û²¶×½µ½Ò»¸öÐźţ¬Ôòpoll·µ»Ø-1£¬
erronÉèÖÃΪEINTR¡£
timeout= =0
²»µÈ´ý¡£²âÊÔËùÓÐÃèÊö·û²¢Á¢¼´·µ»Ø¡£ÕâÊǵõ½ºÜ¶à¸öÃèÊö·ûµÄ״̬¶ø²»×èÈûpol
lº¯ÊýµÄÂÖѯ·½·¨¡£
timeout>0
µÈ´ýtimeoutºÁÃë¡£µ±Ö¸¶¨µÄÃèÊö·ûÖ®Ò»ÒÑ×¼±¸ºÃ£¬»òÖ¸¶¨µÄʱ¼äÖµÒѳ¬¹ýʱÁ¢¼´
·µ»Ø¡£Èç¹ûÒѳ¬Ê±µ«ÊÇ»¹Ã»ÓÐÒ»¸öÃèÊö·û×¼±¸ºÃ£¬Ôò·µ»ØÖµÊÇ0¡££¨Èç¹ûϵͳ²»Ìá
¹©ºÁÃë·Ö±æÂÊ£¬ÔòtimeoutֵȡÕûµ½×î½üµÄÖ§³ÖÖµ¡££©
Ó¦µ±Àí½âÔÚÎļþ½áÊøºÍ¹Ò¶ÏÖ®¼äµÄÇø±ð¡£Èç¹ûÕýÔÚÖÕ¶ËÊäÈëÊý¾Ý£¬²¢¼üÈëÎļþ½áÊø
×Ö·û£¬POLLIN±»´ò¿ª£¬ÓÚÊǾͿɶÁÎļþ½áÊøÖ¸Ê¾£¨read·µ»Ø0£©¡£POLLHUPÔÚreven
tsÖÐûÓдò¿ª¡£Èç¹û¶Áµ÷ÖÆ½âµ÷Æ÷£¬²¢Çҵ绰ÏßÒѹҶϣ¬ÔòÔÚreventsÖн«½Óµ½PO
LLHUP¡£
ÓëselectÒ»Ñù£¬²»ÂÛÒ»¸öÃèÊö·ûÊÇ·ñ×èÈû£¬²¢²»Ó°ÏìpollÊÇ·ñ×èÈû¡£
12.6 Òì²½I/O
ʹÓÃselectºÍpoll¿ÉÒÔʵÏÖÒì²½I/O¡£¹ØÓÚÃèÊö·ûµÄ״̬,ϵͳ²¢²»Ö÷¶¯¸æËßÎÒ
ÃÇÈκÎÐÅÏ¢,ÎÒÃÇÐèÒªÖ÷¶¯µØ½øÐвéѯ(µ÷ÓÃselect»òpoll)¡£ÈçÔÚµÚÊ®ÕÂÖÐËùÊö£¬
ÐźŻú¹¹ÌṩһÖÖÒì²½ÐÎʽµÄ֪ͨijÖÖʼþÒÑ·¢ÉúµÄ·½·¨¡£SVR4ºÍ4.3+BSDÌṩÁË
ʹÓÃÒ»¸öÐźţ¨ÔÚSVR4ÖÐÊÇSIGPOLL£¬ÔÚ4.3+BSDÖÐÊÇSIGIO£©µÄÒì²½I/O·½·¨£¬¸ÃÐÅ
ºÅ֪ͨ½ø³Ì£¬¶Ôij¸öÃèÊö·ûËù¹ØÐĵÄij¸öʼþÒѾ·¢Éú¡£
ÎÒÃÇÒÑÁ˽⵽ÔÚSVR4ÖÐselectºÍpoll¶ÔÈÎÒ»ÃèÊö·û¶¼Äܹ¤×÷¡£ÔÚ4BSDÖУ¬select¶Ô
ÈÎÒ»ÃèÊö·û¶¼Äܹ¤×÷¡£µ«ÊǹØÓÚÒì²½I/OÈ´ÓÐÏÞÖÆ¡£ÔÚSVR4ÖУ¬Òì²½I/OÖ»¶ÔÉ豸Æð
×÷Óá£ÔÚ4.3+BSDÖУ¬Òì²½I/OÖ»¶ÔÖն˺ÍÍøÂçÆð×÷Óá£
SVR4ºÍ4.3+BSDËùÖ§³ÖµÄÒì²½I/OµÄÒ»¸öÏÞÖÆÊÇÿ¸ö½ø³ÌÖ»ÓÐÒ»¸öÐźš£Èç¹ûÒª¶Ô¼¸
¸öÃèÊö·û½øÐÐÒì²½I/O£¬ÄÇôÔÚ½ø³Ì½ÓÊÕµ½¸ÃÐźÅʱ²¢²»ÖªµÀÕâÒ»ÐźŶÔÓ¦ÓÚÄÄÒ»
¸öÃèÊö·û¡£
12.6.1 ϵͳVµÚËÄ·¢Ðаæ
ÔÚϵͳVÖУ¬Òì²½I/OÊÇÁ÷ϵͳµÄÒ»²¿·Ö¡£ËüÖ»¶ÔÁ÷É豸Æð×÷Óá£SVR4Òì²½I/OÐźÅ
ÊÇSIGPOLL¡£
ΪÁ˶ÔÒ»¸öÁ÷É豸Æð¶¯Òì²½I/O£¬ÐèÒªµ÷ÓÃioctl£¬¶øÆäµÚ¶þ¸ö²ÎÊý£¨request£©Ôò
ΪI_SETSIG¡£µÚÈý¸ö²ÎÊýÔòÊÇÓÉͼ12.6ÖÐÒ»¸ö»ò¶à¸ö³£Êý¹¹³ÉµÄÕûÐÍÖµ¡£ÕâЩ³£Êý
ÔÚ<stropts.h>Öж¨Òå¡£
ͼ12.16 ²úÉúSIGPOLLÐźŵÄÌõ¼þ
ͼ12.16ÖÐ "Òѵ½´ï"µÄÒâ˼ÊÇ"Òѵ½´ïÁ÷Ê׵ĶÁ¶ÓÁÐ"¡£
³ýÁ˵÷ÓÃioctlÒÔ˵Ã÷²úÉúSIGPOLLÐźŵÄÌõ¼þ£¬Ò²Ó¦Îª¸ÃÐźŽ¨Á¢Ò»¸öÐźŴ¦Àí³Ì
Ðò¡£»ØÒäͼ10.1£¬¶ÔÓÚSIGPOLLµÄĬÈ϶¯×÷ÊÇÖÕÖ¹¸Ã½ø³Ì£¬ËùÒÔÓ¦ÔÚµ÷ÓÃioctl֮ǰ
½¨Á¢ÐźŴ¦Àí³ÌÐò¡£
12.6.2 4.3+BSD
ÔÚ4.3+BSDÖУ¬Òì²½I/OÊÇÁ½¸öÐźÅSIGIOºÍSIGURGµÄ×éºÏ¡£Ç°ÕßÊÇͨÓÃÒì²½I/OÐźÅ
£¬ºóÕßÔòÖ»±»ÓÃÀ´Í¨Öª½ø³ÌÔÚÍøÂçÁ¬½ÓÉϵ½´ïÁ˷ǹ涨²¨ÌØÂʵÄÊý¾Ý¡£
ΪÁ˽ÓÊÕSIGIOÐźţ¬ÐèÖ´ÐÐÏÂÁÐÈý²½£º
1. µ÷ÓÃsignal»òsigactionΪ¸ÃÐźŽ¨Á¢Ò»¸öÐźŴ¦Àí³ÌÐò¡£
2. ÒÔÃüÁîF_SETOWN£¨3.13½Ú£©µ÷ÓÃfcntlÀ´ÉèÖýø³ÌIDºÍ½ø³Ì×éID£¬ËüÃǽ«½ÓÊÕ¶Ô
ÓÚ¸ÃÃèÊö·ûµÄÐźš£
3. ÒÔÃüÁîF_SETFLµ÷ÓÃfcntlÉèÖÃO_ASYNC״̬±êÖ¾£¬Ê¹ÔÚ¸ÃÃèÊö·ûÉÏ¿ÉÒÔ½øÐÐÒì²½
I/O¡£
eadvºÍwitrevº¯Êý
readvºÍwritevº¯ÊýʹÎÒÃÇÔÚÒ»¸öº¯Êýµ÷ÓÃÖпÉÒÔ¶Á¡¢Ð´¶à¸ö·ÇÁ¬Ðø»º´æ¡£ÓÐʱҲ
½«ÕâÁ½¸öº¯Êý³ÆÎªÉ¢²¼¶Á/¾Û¼¯Ð´¡£
_______________________________________________________________________
______
#include <sys/types.h>
#include <sys/uio.h>
ssize_t readv(int filedes,const struct iovec iov[],int iovcnt);
ssize_t writev(int filedes,const struct iovec iov[],int iovcnt);
Á½¸öº¯Êý·µ»Ø£ºÒѶÁ¡¢Ð´µÄ×Ö½ÚÊý£¬³ö´íΪ-1
_______________________________________________________________________
______
ÕâÁ½¸öº¯ÊýµÄµÚ¶þ¸ö²ÎÊýÊÇ£ºÖ¸Ïòiovec½á¹¹Êý×éµÄÒ»¸öÖ¸Õ룺
Struct iovec {
Void iov_base; »º´æÆðʼµØÖ·
Size_t iov_len; »º´æ´óС
};
iovÊý×éÖеÄÔªËØÊýÓÉiovcnt˵Ã÷¡£
ÕâÁ½¸öº¯ÊýÆðʼÓÚ4.2BSD£¬ÏÖÔÚSVR4Ò²ÌṩËüÃÇ¡£
ÕâÁ½¸öº¯ÊýµÄÔÐÍÒÔ¼°ËüÃÇʹÓõÄiovec½á¹¹ÔÚ¸÷ÖÖÓйØÎÄÏ××ÊÁÏÖж¼ÂÔÓвî±ð¡£
Èç¹ûÎÒÃDZȽÏËüÃÇÔÚSVR4³ÌÐòÔ±ÊÖ²á[AT&T1990e]¡¢SVR4µÄSVID[AT&T1989]£¬ÒÔ¼°
SVR4ºÍ4.3+BSD<sys/uio.h>Í·ÎļþÖе͍Ò壬ÄÇôËüÃÇÖ®¼ä¶¼Óвî±ð£¡Æä²¿·ÖÔÒò
ÊÇ£ºSVIDºÍSVR4³ÌÐòÔ±ÊÖ²á¶ÔÓ¦ÓÚ1988 POSIX.1±ê×¼£¬¶ø·Ç1990°æ¡£ÉÏÃæÊ¾³öµÄÔ
Ðͺͽṹ¶¨Òå¶ÔÓ¦ÓÚreadºÍwriteµÄPOSIX.1¶¨Ò壺»º´æµØÖ·ÊÇvoid£¬»º´æ³¤¶ÈÊÇs
ize_t,·µ»ØÖµÊÇssize_t¡£
×¢Ò⣬readvµÄµÚ¶þ¸ö²ÎÊý±»ËµÃ÷Ϊconst¡£ÕâÈ¡×Ô4.3+BSDÖиú¯ÊýµÄÔÐÍ£¬ÔÚSV
R4µÄÊÖ²áÖÐÔòÎÞ´ËÐÞÊδʡ£¶ÔÓÚreadv´ËÐÞÊδÊÊÇÓÐЧµÄ£¬ÒòΪ²¢²»ÐÞ¸Äiovec½á¹¹
µÄ³ÉÔ±-´Ëº¯ÊýÖ»ÐÞ¸Äiov_baseËùÖ¸ÏòµÄ´æ´¢Çø¡£
4. 3BSDºÍSVR4½«iovcntÏÞÖÆÎª16¡£4.3+BSD¶¨ÒåÁ˳£ÊýUIO_MAXIOV£¬µ±Ç°ÆäÖµ¶¨Òå
Ϊ1024¡£SVIDÉù³Æ³£ÊýIOV_MAXÌṩϵͳVÏÞÖÆ£¬µ«ÊÇËüûÓб»¶¨ÒåÔÚÈÎÒ»SVRÍ·ÎÄ
¼þÖС£
ͼ12.17ÏÔʾÁËreadvºÍwritevµÄ²ÎÊýºÍiovec½á¹¹Ö®¼äµÄ¹ØÏµ¡£writevÒÔ˳Ðòiov[
0],iov[1]ÖÁiov[iovcnt-1] ´Ó»º´æÖоۼ¯Êä³öÊý¾Ý¡£writer·µ»ØÊä³öµÄ×Ö½Ú×ÜÊý
£¬ËüÓ¦µÈÓÚËùÓлº´æ³¤¶ÈÖ®ºÍ
readvÔò½«¶ÁÈëµÄÊý¾Ý°´ÉÏÊöͬÑù˳ÐòÉ¢²¼µ½»º´æÖС£readv×ÜÊÇÏÈÌîÂúÒ»¸ö»º´æ£¬
È»ºóÔÙÌîдÏÂÒ»¸ö¡£readv·µ»Ø¶ÁµÃµÄ×Ü×Ö½ÚÊý¡£Èç¹ûÓöµ½Îļþ½á⣬ÒÑÎÞÊý¾Ý¿É
¶Á£¬Ôò·µ»Ø0¡£
ͼ12.7 readvºÍwritevµÄiovec½á¹¹
ʵÀý
ÔÚ16.7½ÚµÄ_db-writeidxº¯ÊýÖУ¬Ð轫Á½¸ö»º´æÁ¬ÐøµØÐ´µ½Ò»¸öÎļþÖС£µÚ¶þ
¸ö»º´æÊǵ÷ÓÃÕß´«µÝ¹ýÀ´µÄÒ»¸ö²ÎÊý£¬µÚÒ»¸ö»º´æÊÇÎÒÃÇ´´½¨µÄ£¬Ëü°üº¬Á˵ڶþ¸ö
»º´æµÄ³¤¶È£¬ÎļþÖÐÆäËüÐÅÏ¢µÄÎ»ÒÆÁ¿¡£ÓÐÈýÖÖ·½·¨¿ÉÒÔʵÏÖÕâÒ»ÒªÇó£º
1. µ÷ÓÃwrtieÁ½´Î,Ò»´ÎÒ»¸ö»º´æ¡£
2. ·ÖÅäÒ»¸ö´óµ½×ãÒÔ°üº¬Á½¸ö»º´æµÄлº´æ¡£½«Á½¸ö»º´æµÄÄÚÈݸ´ÖƵ½Ð»º´æÖÐ
¡£È»ºó¶Ô¸Ã»º´æµ÷ÓÃwrtieÒ»´Î¡£
3. µ÷ÓÃwritevÊä³öÁ½»º´æ¡£
ÔÚ16.7½ÚÖÐʹÓÃÁËwrite¡£½«ËüÓëÁíÍâÁ½ÖÖ·½·¨½øÐбȽϣ¬¶ÔÎÒÃǺÜÓÐÆô·¢¡£
ͼ12.18ÏÔʾÁËÉÏÃæËùÊöÈýÖÖ·½·¨µÄ½á¹û¡£
ͼ12.18 ±È½ÏwritevºÍÆäËü¼¼ÊõËùµÃµÄʱ¼ä½á¹û
ËùÓõIJâÊÔ³ÌÐòÊä³ö100×Ö½ÚµÄÍ·Îļþ£¬½Ó×ÅÓÖÊä³ö200×Ö½ÚµÄÊý¾Ý¡£ÕâÑù×ö1
0£¬000´Î£¬²úÉúÁËÒ»¸ö°ÙÍò×Ö½ÚµÄÎļþ¡£¸Ã³ÌÐò°´ÉÏÃæËùÊö·½·¨Ð´ÁË3¸ö°æ±¾£¬¸÷
ÔËÐÐÒ»´Î£¬
²âµÃËüÃǸ÷ʹÓõÄÓû§cpuʱ¼ä¡¢ÏµÍ³cpuʱ¼äºÍʱÖÓʱ¼ä¡£ËüÃǵĵ¥Î»¶¼ÊÇÃë¡£
ÈçͬÎÒÃÇËùÁϵ½µÄ£¬µ÷ÓÃwrite¶ø´Î£¬Óëµ÷ÓÃwriteÒ»´Î£¬»òµ÷ÓÃwritev Ò»´ÎÏà±È
£¬ÏµÍ³Ê±¼ä×ÜÊÇÁ½±¶£¬ÕâÓëͼ3.1ÖеĽá¹ûÏàÀàËÆ¡£
½Ó×Å£¬Òª×¢ÒâµÄÊÇ£ºcpuʱ¼ä£¨Óû§¼Óϵͳ£©ÔÚ»º´æ¸´ÖÆ£¬È»ºóÓÃÒ»¸öwrite£¬»òÓÃ
Ò»¸öwritevµÄÇé¿ö¼¸ºõÏàµÈ¡£Á½ÕßµÄÇø±ðÖ»ÊÇÔÚÓû§¿Õ¼äÏÂÖ´ÐеÄʱ¼ä¶àÒ»µã£¨w
ritev£©¡£ÔÚSPARCϵͳÉÏÔËÐÐʱ£¬ÆäºÍÊÇ4.9Ã룬¶øÔÚ80386ϵͳÏÂÔËÐÐÔòÊÇÔ¼8.0
Ãë¡£
¶ÔÓÚͼ12.8×îºóҪ˵Ã÷µÄÊÇ ÔÚSPARCÉϱ¾²âÊÔËùÓõÄʱÖÓʱ¼äÖ÷ÒªÓÃÓÚ´ÅÅÌÊý¾Ý
´«ÊäÉÏ£¬¶øÔÚ386ϵͳÉÏÔòÖ÷ÒªÓÃÓÚcpu·½Ãæ¡£
12.8 readnºÍwritenº¯Êý
ijЩÉ豸,ÌØ±ðÊÇÖÕ¶Ë¡¢ÍøÂçºÍSVR4µÄÁ÷É豸ÓÐÏÂÁÐÁ½ÖÖÐÔÖÊ£º
1. Ò»´Î¶Á²Ù×÷Ëù·µ»ØµÄÊý¾Ý¿ÉÄÜÉÙÓÚËùÒªÇóµÄÊý¾Ý£¬¼´Ê¹»¹Ã»´ïµ½Îļþβ¶Ë¡£Õâ
²»ÊÇÒ»¸ö´íÎó£¬ÎÒÃÇÓ¦µ±¼ÌÐø¶Á¸ÃÉ豸¡£
2. Ò»´Îд²Ù×÷µÄ·µ»ØÖµÒ²¿ÉÄÜÉÙÓÚÖ¸¶¨Êä³öµÄ×Ö½ÚÊý¡£Õâ¿ÉÄÜÊÇÓÉÈô¸ÉÒòËØÔì³É
µÄ£¬ÀýÈ磬ÏÂÓÎÄ£¿éµÄÁ÷Á¿¿ØÖÆÏÞÖÆ¡£ÕâÒ²²»ÊÇ´íÎó£¬ÎÒÃÇÓ¦µ±¼ÌÐøÐ´ÓàϵÄÊý¾Ý
ÖÁ¸ÃÉ豸¡££¨Í¨³££¬Ö»ÓжԷÇ×èÈûÃèÊö·û£¬»ò²¶×½µ½Ò»¸öÐźÅʱ£¬²Å·¢ÉúÕâÖÖwir
te·µ»Ø¡££©
ÔÚ¶Á¡¢Ð´ÅÌÎļþʱûÓÐÕâÁ½ÖÖÐÔÖÊ¡£
ÔÚµÚÊ®°ËÕ£¬ÎÒÃǽ«Ð´Ò»¸öÁ÷¹ÜµÀ£¨»ùÓÚSVR4Á÷»òBSDUnixµÄÓòÌ×½Ó¿Ú£©£¬ÔÚÆäÖÐ
ÐèÒª¿¼ÂÇÕâÐ©ÌØÐÔ¡£ÏÂÃæÁ½¸öº¯ÊýreadnºÍwritenµÄ¹¦ÄÜÊǶÁ¡¢Ð´Ö¸¶¨µÄN×Ö½ÚÊý¾Ý
£¬²¢´¦Àí·µ»ØÖµÐ¡ÓÚÒªÇóÖµµÄÇé¿ö¡£ÕâÁ½¸öº¯ÊýÖ»Êǰ´Ðè¶à´Îµ÷ÓÃread£¬writeÖ±
ÖÁ¶Á¡¢Ð´ÁËN×Ö½ÚÊý¾Ý¡£
_______________________________________________________________________
______
#include "ourhdr.h"
ssize_t readn(int filedes,void *buff,size_t nbytes);
ssize_t writen(int filedes,void *buff,size_t nbytes);
Á½¸öº¯Êý·µ»Ø£ºÒѶÁ¡¢Ð´×Ö½ÚÊý£¬³ö´íΪ-1
_______________________________________________________________________
______
ÔÚÒª½«Êý¾Ýдµ½ÉÏÃæÌáµ½µÄÉ豸ÉÏʱ£¬¾Í¿Éµ÷ÓÃwriten£¬µ«Êǽöµ±ÏȾÍÖªµÀÒª½ÓÊÕ
Êý¾ÝµÄÊýÁ¿Ê±£¬²Åµ÷ÓÃreadn£¨Í¨³££¬ÎÒÃǵ÷ÓÃreadÒÔ½ÓÊÕÀ´×ÔÕâЩÉ豸µÄÊý¾Ý£©
¡£
³ÌÐò12.12£¬12.13ÊÇwritenºÍreadnµÄÒ»ÖÖʵÏÖ¡£
#include "ourhdr.h"
ssize_t /* Write "n" bytes to a descriptor. */
writen(int fd, const void *vptr, size_t n)
{
size_t nleft, nwritten;
const char *ptr;
ptr = vptr; /* can't do pointer arithmetic on void* */
nleft = n;
while (nleft > 0) {
if ( (nwritten = write(fd, ptr, nleft)) <= 0)
return(nwritten); /* error */
nleft -= nwritten;
ptr += nwritten;
}
return(n);
}
³ÌÐò12.12 writeº¯Êý
#include "ourhdr.h"
ssize_t /* Read "n" bytes from a descriptor. */
readn(int fd, void *vptr, size_t n)
{
size_t nleft, nread;
char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ( (nread = read(fd, ptr, nleft)) < 0)
return(nread); /* error, return < 0 */
else if (nread == 0)
break; /* EOF */
nleft -= nread;
ptr += nread;
}
return(n - nleft); /* return >= 0 */
}
³ÌÐò12.13 readnº¯Êý
12.9 ´æ´¢Ó³ÕÕI/O
´æ´¢Ó³ÕÕI/Oʹһ¸ö´ÅÅÌÎļþÓë´æ´¢¿Õ¼äÖеÄÒ»¸ö»º´æÏàÓ³ÕÕ¡£ÓÚÊǵ±´Ó»º´æÖÐÈ¡
Êý¾Ý£¬¾ÍÏ൱ÓÚ¶ÁÎļþÖеÄÏàÓ¦×Ö½Ú¡£ÓëÆäÀàËÆ£¬½«Êý¾Ý´æÈ뻺´æ£¬ÔòÏàÓ¦×Ö½Ú¾Í
×Ô¶¯µØÐ´ÈëÎļþ¡£ÕâÑù£¬¾ÍʹÎÒÃÇÔÚ²»Ê¹ÓÃread¡¢writeÇé¿öÏ¿ÉÒÔÖ´ÐÐI/O¡£
ΪÁËʹÓÃÕâÖÖ¹¦ÄÜ£¬Ó¦Ê×ÏȸæËßϵͳºË½«Ò»¸ö¸ø¶¨µÄÎļþÓ³ÕÕµ½Ò»¸ö´æ´¢ÇøÓòÖС£
ÕâÊÇÓÉmmapº¯ÊýʵÏֵġ£
_______________________________________________________________________
______
#include <sys/types.h>
#include <sys/mman.h>
caddr_t mmap(caddr_t addr, size_t lan,int prot,int flag,
int filedes,off_t off);
·µ»Ø£ºÈô³É¹¦ÎªÓ³ÕÕÇøµÄÆðʼµØÖ·£¬³ö´íΪ-1
_______________________________________________________________________
______
´æ´¢Ó³ÕÕI/OÒѾÓÃÁ˺ܶàÄê¡£4.1BSD£¨1981£©ÒÔÆävreadºÍvwriteº¯ÊýÌṩÁËÒ»ÖÖ
²»Í¬ÐÎʽµÄ´æ´¢Ó³ÕÕI/O¡£4.2BSDûÓÐʹÓÃÕâÁ½¸öº¯Êý£¬¶øÊÇÏ£ÍûʹÓÃmmapº¯Êý¡£
µ«ÊÇÓÉÓÚLeffler et al[1989]2.5½ÚÖÐ˵Ã÷µÄÀíÓÉ£¬4.2BSDʵ¼Ê²¢Ã»Óаüº¬mmapº¯
Êý¡£Gingell,MoranºÍShannon[1987]˵Ã÷ÁËmmapµÄÒ»ÖÖʵÏÖ¡£ÏÖÔÚ£¬SVR4ºÍ4.3+B
SD¶¼Ö§³Ömmapº¯Êý¡£
Êý¾ÝÀàÐÍcaddr_tͨ³£¶¨ÒåΪchar *¡£addr²ÎÊýÓÃÓÚÖ¸¶¨Ó³ÕÕ´æ´¢ÇøµÄÆðʼµØÖ·¡£
ͨ³£½«ÆäÉèÖÃΪ0£¬Õâ±íʾÓÉϵͳѡÔñ¸ÃÓ³ÕÕÇøµÄÆðʼµØÖ·¡£´Ëº¯ÊýµÄ·µ»ØµØÖ·ÊÇ
£º¸ÃÓ³ÕÕÇøµÄÆðʼµØÖ·¡£
filedesÖ¸¶¨Òª±»Ó³ÕÕÎļþµÄÃèÊö·û¡£ÔÚÓ³ÕÕ¸ÃÎļþµ½Ò»¸öµØÖ·¿Õ¼ä֮ǰ£¬ÏÈÒª´ò
¿ª¸ÃÎļþ¡£lenÊÇÓ³ÕÕµÄ×Ö½ÚÊý£»offÊÇÒªÓ³ÕÕ×Ö½ÚÔÚÎļþÖÐµÄÆðÊ¼Î»ÒÆÁ¿£¨ÏÂÃæ½«
˵Ã÷¶ÔoffÖµÓÐijЩÏÞÖÆ¡££©
ÔÚ˵Ã÷ÆäÓà²ÎÊý֮ǰ£¬ÏÈ¿´Ò»Ï´洢ӳÕÕÎļþµÄ»ù±¾Çé¿ö¡£Í¼12.19ÏÔʾÁËÒ»¸ö´æ
´¢Ó³ÕÕÎļþ¡££¨»ØÒäͼ7.3Öнø³Ì´æ´¢¿Õ¼äµÄµäÐͰ²ÅÅÇé¿ö£©¡£
ͼ12.19 ´æ´¢Ó³ÕÕÎļþµÄÀý×Ó
ÔÚ´ËͼÖУ¬"ÆðʼµØÖ·"ÊÇmmapµÄ·µ»ØÖµ¡£ÔÚͼÖУ¬Ó³ÕÕ´æ´¢ÇøÎ»ÓڶѺÍÕ»Ö®¼ä£ºÕâ
ÊôÓÚʵÏÖϸ½Ú£¬¸÷ÖÖʵÏÖÖ®¼ä¿ÉÄܲ»Í¬¡£
proc²ÎÊý˵Ã÷Ó³ÕÕ´æ´¢ÇøµÄ±£»¤ÒªÇó¡£
¶ÔÓÚÓ³ÕÕ´æ´¢ÇøËùÖ¸¶¨µÄ±£»¤ÒªÇóÏàÓ¦ÓëÏàÓ¦ÎļþµÄopen·½·¨ÏàÓ¦×Ô¼º¡£ÀýÈ磬
Èô¸ÃÎļþÊÇÖ»¶Á´ò¿ªµÄ£¬ÄÇô¶ÔÓ³ÕÕ´æ´¢Çø¾Í²»ÄÜÖ¸¶¨PROT_WRITE¡£
ͼ12.20 ´æ´¢Ó³ÕÕÇøµÄ±£»¤
flag²ÎÊýÓ°ÏìÓ³ÕÕ´æ´¢ÇøµÄ¶àÖÖÊôÐÔ£º
MAP_FIXED ·µ»ØÖµ±ØÐëµÈÓÚaddr¡£ÒòΪÕâ²»ÀûÓÚ¿ÉÒÆÖ²ÐÔ£¬ËùÒÔ²»¹ÄÀøÊ¹ÓôË
±êÖ¾¡£Èç¹ûĩָ¶¨´Ë±êÖ¾£¬¶øÇÒaddr·Ç0£¬ÔòϵͳºËÖ»°ÑaddrÊÓΪºÎ´¦ÉèÖÃÓ³ÕÕÇø
µÄÒ»ÖÖ½¨Òé¡£
MAP_SHARED ÕâÒ»±ê־˵Ã÷Á˱¾½ø³Ì¶ÔÓ³ÕÕÇøËù½øÐеĴ洢²Ù×÷µÄÅäÖô˱ê־˵Ã÷
´æ´¢²Ù×÷ÐÞ¸ÄÓ³ÕÕÎļþ-Ò²¾ÍÊÇ£¬´æ´¢²Ù×÷Ï൱ÓÚ¶Ô¸ÃÎļþµÄwrite¡£±ØÐëÖ¸¶¨±¾±ê
Ö¾»òÏÂÒ»¸ö±êÖ¾£¨MAP_PRIVATE£©¡£
MAP_PRIVATE ±¾±ê־˵Ã÷£¬¶ÔÓ³ÕÕÇøµÄ´æ´¢²Ù×÷µ¼Ö´´½¨¸ÃÓ³ÕÕÎļþµÄÒ»¸ö¸±±¾
¡£ËùÓкóÀ´¶Ô¸ÃÓ³ÕÕÇøµÄ´æ·Ã¶¼ÊÇ´æ·Ã¸Ã¸±±¾£¬¶ø²»ÊÇÔʼÎļþ¡£
4.3+BSD»¹ÓÐÁíÍâһЩMAP_XXX±êÖ¾Öµ£¬ËüÃÇÊÇÕâÖÖÏÖʵËùÌØÓеġ£ÏêϸÇé¿öÇë²Î¼û
4.3+BSD mmap£¨2£©ÊÖ²áÒ³¡£
offºÍaddrµÄÖµ£¨Èç¹ûÖ¸¶¨ÁËMAP_FIXED£©Í¨³£Ó¦µ±ÊÇϵͳÐé´æÒ³³¤¶ÈµÄ±¶Êý¡£ÔÚS
VRÖУ¬Ðé´æÒ³³¤¶È¿ÉÓÃsysconfº¯Êý£¨²ÎÊýSC_PAGSIZE£¬2.5.4½Ú£©µÃµ½¡£ÔÚ4.3+B
SD֮ϣ¬Ò³³¤¶ÈÓÉÍ·Îļþ<sys/param.h>Öеij£ÊýNBPG¶¨Òå¡£ÒòΪoffºÍaddr³£³£Ö¸
¶¨Îª0£¬ËùÒÔÕâÖÖÒªÇóÒ»°ã²¢²»ÊÇÎÊÌâ¡£
ÓëÓ³ÕÕ´æ´¢ÇøÏà¹ØÓÐÁ½¸öÐźţºSIGSEGVºÍSIGBUS¡£ÐźÅSIGSEGVͨ³£ÓÃÓÚָʾ½ø³Ì
ÊÔͼ´æÈ¡Ëü²»ÄÜ´æÈ¡µÄ´æ´¢Çø¡£Èç¹û½ø³ÌÆóͼ´æÊý¾Ýµ½ÓÃmmapÖ¸¶¨ÎªÖ»¶ÁµÄÓ³ÕÕ´æ
´¢Çø£¬ÄÇôҲ²úÉú´ËÐźš£Èç¹û´æÈ¡Ó³ÕÕÇøµÄij¸ö²¿·Ö£¬¶øÔÚ´æÈ¡Ê±ÕâÒ»²¿·ÖÒѲ»
´æÔÚ£¬Ôò²úÉúSIGBUSÐźš£ÀýÈ磬ÓÃÎļþ³¤¶ÈÓ³ÕÕÒ»¸öÎļþ£¬µ«ÔÚ´æ·Ã¸ÃÓ³ÕÕÇøÖ®
ǰ¡£ÁíÒ»¸ö½ø³ÌÒѽ«¸ÃÎļþ½Ø¶Ì¡£´Ëʱ£¬Èç¹û½ø³ÌÆóͼ´æÈ¡¶ÔÓ¦ÓÚ¸ÃÎļþβ¶Ë²¿·Ö
µÄÓ³ÕÕÇø£¬Ôò½ÓÊÕµ½SIGBUSÐźš£
ÔÚforkÖ®ºó£¬×Ó½ø³Ì¼Ì³Ð´æ´¢Ó³ÕÕÇø£¬£¨ÒòΪ×Ó½ø³Ì¸´ÖƸ¸½ø³ÌµØÖ·¿Õ¼ä£¬¶ø´æ´¢
Ó³ÕÕÇøÊǸõØÖ·¿Õ¼äÖеÄÒ»²¿·Ö¡££©µ«ÊÇÓÉÓÚͬÑùµÄÀíÓÉ£¬execºóµÄгÌÐòÔò²»¼Ì
³Ð´Ë´æ´¢Ó³ÕÕÇø¡£
½ø³ÌÖÕֹʱ£¬»òµ÷ÓÃÁËmunmapÖ®ºó£¬´æ´¢Ó³ÕÕÇø¾Í±»×Ô¶¯È¥³ý¡£¹Ø±ÕÎļþÃèÊö·ûf
iledes²¢²»½â³ýÓ³ÕÕÇø¡£
_______________________________________________________________________
______
#include <sys/types.h>
#include <sys/mman.h>
int munmap(caddr_t addr,size_t len);
·µ»Ø£ºÈô³É¹¦Îª0£¬³ö´íΪ-1
_______________________________________________________________________
______
munmap ²¢²»Ó°Ïì±»Ó³ÕյĶÔÏó-Ò²¾ÍÊÇ£¬µ÷ÓÃmunmap²¢²»Ê¹Ó³ÕÕÇøµÄÄÚÈÝдµ½´ÅÅÌ
ÎļþÉÏ¡£¶ÔÓÚMAP_SHAREDÇøµÄ´ÅÅÌÎļþµÄ¸üУ¬ÔÚдµ½´æ´¢Ó³ÕÕÇøÊ±°´ÏµÍ³ºËÐé´æ
Ëã·¨×Ô¶¯½øÐС£
ijЩϵͳÌṩÁËÒ»¸ömsyncº¯Êý£¬ËüÀàËÆÓÚfsyncº¯Êý£¨4.24½Ú£©£¬µ«¶Ô´æ´¢Ó³ÕÕÇø
Æð×÷Óá£
ʵÀý
ϵͳ12.14Óô洢ӳÕÕI/O¸´ÖÆÒ»¸öÎļþ£¨ÀàËÆÓÚcp(1)ÃüÁ¡£Ê×ÏÈ´ò¿ª±»¸´ÖƺÍ
¸´ÖƵ½µÄÁ½¸öÎļþ£¬È»ºóµ÷ÓÃfstatµÃµ½ÊäÈëÎļþµÄ³¤¶È¡£ÎÒÃÇÔÚµ÷ÓÃmmapºÍÉèÖÃ
Êä³öÎļþ³¤¶Èʱ¶¼ÐèʹÓÃÊäÈëÎļþ³¤¶È¡£µ÷ÓÃlseek£¬È»ºóдһ¸ö×Ö½ÚÒÔÉèÖÃÊä³ö
ÎļþµÄ³¤¶È¡£Èç¹û²»ÉèÖÃÊä³öÎļþµÄ³¤¶È£¬Ôò¶ÔÊä³öÎļþµ÷ÓÃmmapÒ²ÊÇ¿ÉÒԵ쬵«
ÊǶÔÏà¹Ø´æ´¢ÇøµÄµÚÒ»´Î´æ·Ã»á²úÉúSIGBUS¡£ÎÒÃÇÒ²¿ÉʹÓÃftruncateº¯ÊýÀ´ÉèÖÃ
Êä³öÎļþµÄ³¤¶È£¬µ«ÊDz¢·ÇËùÓÐϵͳ¶¼Ö§³Ö¸Ãº¯ÊýÀ©³äÎļþ³¤¶È£¨¼û4.13½Ú£©¡£
È»ºó¶Ôÿ¸öÎļþµ÷ÓÃmmap£¬½«ÎļþÓ³ÕÕµ½´æ´¢Çø£¬×îºóµ÷ÓÃmemcpy½«ÊäÈ뻺´æµÄÄÚ
Èݸ´ÖƵ½Êä³ö»º´æ¡£ÔÚ´ÓÊäÈ뻺´æ£¨src£©È¡Êý¾Ý×Ö½Úʱ£¬ÏµÍ³ºË×Ô¶¯¶ÁÊäÈëÎļþ
£»ÔÚ½«Êý¾Ý´æÈëÊä³ö»º´æ£¨dst£©Ê±£¬ÏµÍ³ºË¾Í×Ô¶¯½«Êý¾Ýдµ½Êä³öÎļþÖС£
½«´æ´¢ÇøÓ³ÕÕ¸´ÖÆÓëÓÃread£¬write½øÐеĸ´ÖÆ£¨»º´æ³¤¶ÈΪ8192£©Ïà±È½Ï£¬µÃµ½
ͼ12.21ÖÐËùʾµÄ½á¹û¡£
ͼ12.21 read/writeÓëmmap/memcpy±È½ÏµÄʱ¼ä½á¹û
ʱ¼äµ¥Î»ÊÇÃ룬±»¸´ÖÆÎļþµÄ³¤¶ÈÊÇÔ¼3°ÙÍò×Ö½Ú¡£
¶ÔÓÚSPARC£¬Á½ÖÖ¸´ÖÆ·½Ê½µÄCPUʱ¼ä£¨Óû§+ϵͳ£©Ïàͬ£¬¶¼ÊÇ2.6Ãë¡££¨ÕâÓëͼ1
2.18ÖÐwritevµÄÇé¿öÀàËÆ£©¡£¶ÔÓÚ386£¬mmap/memcpy·½Ê½´óÔ¼ÊÇread/write·½Ê½µÄ
Ò»°ë¡£
ʹÓÃmmapʱ£¬¶ÔÓÚSPARCºÍ386ϵͳʱ¼ä¶¼¼õÉÙµÄÔÒòÊÇ£ºÏµÍ³ºËÖ±½Ó¶ÔÓ³ÕÕ´æ´¢»º
´æ×÷I/O²Ù×÷¡£¶øÔÚread/write·½Ê½£¬ÏµÍ³ºËÒªÔÚÓû§»º´æºÍËü×Ô¼ºµÄ»º´æÖ®¼ä½ø
Ðи´ÖÆ£¬È»ºóÓÃÆä»º´æ×÷I/O¡£
ÁíÒ»¸öҪעÒâµÄÊÇ£¬Ê¹ÓÃmmap/memcpyʱ£¬Ê±ÖÓʱ¼äÖÁÉÙ¼õ°ë¡£
½«Ò»¸öÆÕͨÎļþ¸´ÖƵ½ÁíÒ»¸öÆÕͨÎļþÖÐʱ£¬´æ´¢Ó³ÕÕI/O±È½Ï¿ì¡£µ«ÊÇÓÐһЩÏÞ
ÖÆ¡£²»ÄÜÓÃÆäÔÚijЩÉ豸֮¼ä£¨ÀýÈçÍøÂçÉ豸»òÖÕ¶ËÉ豸£©½øÐи´ÖƶԱ»¸´ÖƵÄÎÄ
¼þ½øÐÐÓ³ÕÕºó£¬Ò²Òª×¢Òâ¸ÃÎļþµÄ³¤¶ÈÊÇ·ñ¸Ä±ä¡£¾¡¹ÜÈç´Ë£¬ÓкܶàÓ¦ÓóÌÐò»á´Ó
´æ´¢Ó³ÕÕI/OµÃµ½ºÃ´¦£¬ÒòΪËü´¦ÀíµÄÊÇ´æ´¢¿Õ¼ä¶ø²»ÊǶÁ¡¢Ð´Ò»¸öÎļþ£¬ËùÒÔ³£
³£¿ÉÒÔ¼ò»¯Ëã·¨¡£Óô洢ӳÕÕI/O¿ÉÒÔµÃÒæµÄÒ»¸öÀý×ÓÊÇÖ¡»º´æÉ豸£¬¸ÃÉ豸ÒýÓÃ
Ò»¸öλһӳÕÕÏÔʾ¡£
Krieger,StummºÍUnrau[1992]ÖеĵÚÎåÕÂ˵Ã÷ÁËÒ»¸öʹÓô洢ӳÕÕI/OµÄ±ê×¼I/O¿â
¡£
ÔÚ14.9½Ú½«·µ»Øµ½´æ´¢Ó³ÕÕI/O£¬ÆäÖÐÓÐÒ»¸öÀý×Ó£¬ËµÃ÷ÔÚSVR4ºÍ4.3+BSDÖ®ÏÂÈçºÎ
ʹÓô洢ӳÕÕI/OÔÚÓйؽø³Ì¼äÌṩ¹²Ïí´æ´¢Çø¡£
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h> /* mmap() */
#include <fcntl.h>
#include "ourhdr.h"
#ifndef MAP_FILE /* 44BSD defines this & requires it to mmap files */
#define MAP_FILE 0 /* to compile under systems other than 44BSD */
#endif
int
main(int argc, char *argv[])
{
int fdin, fdout;
char *src, *dst;
struct stat statbuf;
if (argc != 3)
err_quit("usage: a.out <fromfile> <tofile>");
if ( (fdin = open(argv[1], O_RDONLY)) < 0)
err_sys("can't open %s for reading", argv[1]);
if ( (fdout = open(argv[2], O_RDWR | O_CREAT | O_TRUNC,
FILE_MODE)) < 0)
err_sys("can't creat %s for writing", argv[1]);
if (fstat(fdin, &statbuf) < 0) /* need size of input file */
err_sys("fstat error");
/* set size of output file */
if (lseek(fdout, statbuf.st_size - 1, SEEK_SET) == -1)
err_sys("lseek error");
if (write(fdout, "", 1) != 1)
err_sys("write error");
if ( (src = mmap(0, statbuf.st_size, PROT_READ,
MAP_FILE | MAP_SHARED, fdin, 0)) == (caddr_t) -1)
err_sys("mmap error for input");
if ( (dst = mmap(0, statbuf.st_size, PROT_READ | PROT_WRITE,
MAP_FILE | MAP_SHARED, fdout, 0)) == (caddr_t) -1)
err_sys("mmap error for output");
memcpy(dst, src, statbuf.st_size); /* does the file copy */
exit(0);
}
³ÌÐò12.14 Óô洢ӳÕÕI/O¸´ÖÆÎļþ
12.10 ÕªÒª
±¾ÕÂ˵Ã÷Á˺ܶà¸ß¼¶I/O¹¦ÄÜ£¬ÆäÖдó¶àÊý½«ÔÚºóÃæÕ½ڵÄÀý×ÓÖÐʹÓãº
l ·Ç×èÈûI/O-·¢Ò»¸öI/O²Ù×÷£¬²»Ê¹Æä×èÈû£»
l ¼ÇÂ¼Ëø£»
l ϵͳVÁ÷»úÖÆ£»
l I/O¶à·ת½Ó-selectºÍpollº¯Êý£»
l readvºÍwritevº¯Êý£»
l ´æ´¢¿Õ¼äÓ³ÕÕI/O£¨mmap£©;
ϰÌ⣺
12.1 ɾ³ý³ÌÐò12.6forÑ»·Öеڶþ´Îµ÷ÓÃwriteµÄÓï¾äºó½á¹ûÈçºÎ£¬ÎªÊ²Ã´£¿
12.2 ²é¿´ÏµÍ³ÖÐ<sys/types.h>Í·Îļþ£¬²¢Ñо¿selectºÍËĸöFD_ºêµÄʵÏÖ¡£
12.3 <sys/types.h>Í·ÎļþÖж¨ÒåÁËfd_setÊý¾ÝÀàÐÍ¿ÉÒÔ´¦ÀíµÄ×î´óÃèÊö·ûÊý£¬¼Ù
ÉèÎÒÃÇÐèÒª½«ÃèÊö·ûÊýÔö¼Óµ½2048£¬¸ÃÈçºÎʵÏÖ£¿
12.4 ±È½Ï´¦ÀíÐźÅÁ¿¼¯µÄº¯Êý£¨10.11½Ú£©ºÍfd_setÃèÊö·û¼¯µÄº¯Êý£¬²¢Ñо¿ÔÚÄã
µÄϵͳÉÏËüÃǵÄʵÏÖ·½·¨¡£
12.5 getmsg¿ÉÒÔ·µ»Ø¶àÉÙÖÖ²»Í¬µÄÐÅÏ¢£¿
12.6 ÓÃselect»òpollʵÏÖÒ»¸öÓësleepÀàËÆµÄº¯Êýsleep_us£¬²»Í¬Ö®´¦ÊÇÒªµÈ´ýÖ¸
¶¨µÄÈô¸É΢Ãî¡£±È½ÏÕâ¸öº¯ÊýºÍBSDÖеÄusleepº¯Êý¡£
12.7 ÊÇ·ñ¿ÉÒÔÀûÓý¨ÒéÐÔËøÀ´ÊµÏÖ³ÌÐò10.17Öеĺ¯ÊýTELL_WAIT¡¢TELL_PARENT¡¢
TELL_CHILD¡¢WAIT_PARENTÒÔ¼°WAIT_CHILD£¿Èç¹û¿ÉÒÔ£¬±àдÕâЩº¯Êý²¢²âÊÔÆä¹¦
ÄÜ¡£
12.8 ÓÃselect»òpoll²âÊԹܵÀµÄÈÝÁ¿¡£½«ÆäÖµÓëµÚ¶þÕµÄPIPE_BUFµÄÖµ±È½Ï¡£
12.9 ÔËÐгÌÐò12.14¿½±´Ò»¸öÎļþ£¬¼ì²éÊäÈëÎļþµÄÉÏÒ»´Î·ÃÎÊʱ¼äÊÇ·ñ¸Ä±äÁË£¿
12.10 ÔÚ³ÌÐò12.14ÖÐmmapºóµ÷ÓÃclose¹Ø±ÕÊäÈëÎļþ£¬ÒÔÑéÖ¤¹Ø±ÕÃèÊö·û²»»áʹÄÚ
´æÓ³ÕÕI/OʧЧ¡£
--
--
¡ù À´Ô´:¡¤BBS ˮľÇ廪վ smth.org¡¤[FROM: 202.38.248.38]
BBSˮľÇ廪վ¡Ã¾«»ªÇø