- , . read , - - ( ). , , read , , , - . , , - - , - , , . , , "no delay" ( ), read , . , ( 10), , . , , . , , - , - , . 107 , , ( , , - ); , - , , . , , - , , . , , , , , - . , - : , , open. , - - . , , , , . , , , - : , , . .te1 5.12.4  , , , , - , . - - . - 0 , , - - . 0 , , - ( 7) - . - , , - - . , - , - , , . , , , , . - , - , , . , . 5.12.5  5.18 - . , 108 +---------------------------------+ | char string[] = "hello"; | | main() | | { | | char buf[1024]; | | char *cp1,*cp2; | | int fds[2]; | | | | cp1 = string; | | cp2 = buf; | | while(*cp1) | | *cp2++ = *cp1++; | | pipe(fds); | | for (;;) | | { | | write(fds[1],buf,6); | | read(fds[0],buf,6); | | } | | } | +---------------------------------+ 5.18. "hello" . , , , , , - . , , 5.19, - "fifo". - () , - +------------------------------------------------------------+ | #include | | char string[] = "hello"; | | main(argc,argv) | | int argc; | | char *argv[]; | | { | | int fd; | | char buf[256]; | | | | /* | | */ | | mknod("fifo",010777,0); | | if(argc == 2) | | fd = open("fifo",O_WRONLY); | | else | | fd = open("fifo",O_RDONLY); | | for (;;) | | if(argc == 2) | | write(fd,string,6); | | else | | read(fd,buf,6); | | } | +------------------------------------------------------------+ 5.19. 109 "hello"; - , . - , "fifo", . ( ). 5.13 DU dup , . . : newfd = dup(fd); fd - , , newfd - , . dup , - - - - +---------+ +------------+ +--------------+ 0| ----+----+ | | | - | +---------+ | | | | - | 1| ----+---++-->| | | - | +---------+ | +------------+ | - | 2| ----+--++--->| - | | - | +---------+ +---->| - | | - | 3| ----+----+ | - | | - | +---------+ | | - | +--------------+ 4| ----+---+| | - | +---->| - | +---------+ || | - | | | (/etc/ | 5| ----+--+|| +------------+ | +-->| 2 passwd)| +---------+ ||| | - | | | +--------------+ 6| ----++ ||+-->| +--+ | | - | +---------++-||--->| 2 | | | - | 7| | || +------------+ | | - | +---------+ || | - | | | - | | - | || +------------+ | | - | +---------+ || | | | | - | |+--->| 1 +----|+ | - | | +------------+ || | - | | | - | || +--------------+ | | - | || | - | | | - | |+->| (local)| | | - | | | 1 | | | - | | +--------------+ | +------------+ | | - | | | | | | - | +---->| 1 +----+ | - | +------------+ | - | | - | +--------------+ | - | +------------+ 5.20. dup 110 , , . , , 5.20, , - : (open) "/etc/passwd" ( 3), "local" ( 4), "/etc/passwd" ( - 5) , , (dup) 3, - 6. , dup - , , - , , - , . , , , , , . , 5.21. i - , "/etc/passwd", j - , i dup. , - i j, . , - read , buf1 buf2 . , +--------------------------------------------------------+ | #include | | main() | | { | | int i,j; | | char buf1[512],buf2[512]; | | | | i = open("/etc/passwd",O_RDONLY); | | j = dup(i); | | read(i,buf1,sizeof(buf1)); | | read(j,buf2,sizeof(buf2)); | | close(i); | | read(j,buf2,sizeof(buf2)); | | } | +--------------------------------------------------------+ 5.21. , - dup ( 5.2). close - , - - , . , - "" ( - 1), , , . 7 pipe dup . 111 5.14  , , - , . , - "", . 10. - , - , , (. 2). mount () - , umount () . mount, , , - . mount: mount(special pathname,directory pathname,options); special pathname - , , directory pathname - - , ( , ), options , - " " ( + - - - - - - - - - - - - - - - - - - - - - - - - + / | | | +----------------+--+-------------+ | | | | | bin etc usr | | | - | +-----+-----+ +----+----+ - | | | | | | - | cc date sh getty passwd - + - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - + / | | | +----------------+--+-------------+ | | | | | bin include src | | | | | /dev/dsk1 +-----+-----+ | | | | | | | | | awk banner yacc stdio.h uts + - - - - - - - - - - - - - - - - - - - - - - - - + 5.22. mount , write creat, - ). , mount : mount("/dev/dsk1","/usr",0); , "/dev/dsk1", "/usr" (. 112 5.22). "/dev/dsk1" , .. , . - , , . mount "/usr". , . link , V - , (. 5.15). . : * , (- ); * , ; * ("/" "/dev/dsk1" 5.22); * , ( 5.22 "usr", ). - , mount, - . +------------------------------------------------------------+ | mount | | : | | | | (" ") | | : | | { | | ( ) | | (); | | (- | | namei); | | ; | | , | | ( namei); | | ( | | > 1) | | { | | ( iput); | | (); | | } | | ; | | | | ; | | ; | | ; | | ; | | ( | | iget), ; | | , | | ; | | ( iput); | | ;| | } | +------------------------------------------------------------+ 5.23. 113 5.23 . , . mount umount , , - . . , - , , , , , . - , 1 ( 1 - ?), (. 5.27). - , - . , - , , . - , mount . - , - , , - , (. 5.26). , , , - ( 10). , . ( getblk) , read. - , , , "..", , . - . , () , - . - - . , 0. ( - ) , - . , , ialloc, - . , , (. 5.17 ). - , , . , " ", - . 5.24 - mount. 114 5.14.1  namei iget , . - : , - , , ( ), . - shell'. +------------------+ +--------------------+ +------------------+ | | | , + - - + | | | | | | | | | | | +-------+ | "-|<---+ | |+->| | | " | || | || +-------+ | =1| | | || +------------------+ |+ >+--------------------+| | | | | ---++ +------------------+ +---+ -| | | | | | | +---+- | | =0| | +--------------------+ +------------------+ | | | +------------------+<---+ | | | -| | | | | | | | | | | | =1| +--------------------+ +------------------+ +------------------+ 5.24. mount /dev/dsk1 /usr cd /usr/src/uts cd ../../.. mount - mount, "/dev/dsk1" "/usr". - cd ( ) shell - chdir, , , "/usr". cd , ".." . - , , , - , iget ( 5.25), , 4.3, , , , - . , , . - . , - , , 115 +------------------------------------------------------------+ | iget | | : | | : | | { | | | | { | | ( ) | | { | | ( ) | | { | | ( ); | | ; /* */ | | } | | /* */ | | ( ) | | { | | - | | ; | | | | ; | | ; | | ; /* */ | | } | | ( ) | | ; | | ; | | (); | | } | | | | /* */ | | ; | | ; | | -, ;| | ( bread); | | (, | | 1); | | (); | | } | | } | +------------------------------------------------------------+ 5.25. - . "/usr" , , , " ", - . - , , , - , namei ( 5.26). , 4.11. , , , - . , 116 +------------------------------------------------------------+ | namei /* */| | : | | : | | { | | ( ) | | = ( iget); | | | | = | | ( iget); | | | | ( ) | | { | | ; | | | | ; | | ( - | | "..") | | ; /* */| | : | | ( ), - | | bmap, bread brelse; | | ( | | ( )) | | { | | -| | ; | | ( - | | | | "..") | | { | | /* */ | | | | ; | | ( iput); | | = ;| | ; | | - | | ; | | ( ".."); | | } | | ( iput); | | = | | ( iget); | | } | | /* | | */ | | ( ); | | } | | ( ); | | } | +------------------------------------------------------------+ 5.26. , , "..", . , 117 , , , "..", . , , "..". (cd "../../..") , "/usr/src/uts". namei, . - "/usr/src" ".." . ".." - , ( ) - - "usr" - namei. , - ".." . , ".." , - , ".." . - , "usr", ( , - "usr") ( "usr" ) . "/usr" - ".." ("/"). - chdir , - , . 5.14.2  umount: umount(special filename); special filename . - ( 5.27) - , , ( iput) , . , - , , , . - , , ( 7), - , . - , umount : ,