-------------------+ 7.23. , . 0, 210 , : , exec, . - , allocreg , . exit exec , ( freereg), - "". +----------------+ - +----------------+ | - | , - | - | | - | | - | | - | /bin/date | - | | - | 0 +----------------+ | - | | | | - | -- - - - - -|- | | - | | | /bin/who | +----------------+ - +----------------+ | -|- - - - - -+ | - | | /bin/date| | - | | <+-----------+ | - | +----------------+ | +----------------+ | - | | | | | - | +-----------+- | | - | | /bin/date | | - | -+----------------+ | - | | - | | - | | - | +----------------+ +----------------+ 7.24. , 7.21, exec "/bin/date" - . "/bin/date" , ( 7.24) exec 1. "/bin/date" , - detachreg freereg, 0. , , - exec 0 . , , exec "/bin/who", , - "/ bin/date". - "/bin/who", "/bin/date". , "/bin/who", - . - , , , . , - exec. - 211 ( ) chmod - "sticky-bit", . , "sticky-bit", - , , exit exec, - 0. , 1, . ( ), - , . , - . - , ; , , (. 9). , - , "sticky-bit" ( , "" ), - : 1. , - , . 2. (chmod), "sticky-bit", . 3. (unlink), - , ; , , . , , . 4. , . - . 5. , , - , "sticky-bit", - . , , . "sticky-bit" , . - . , ( ); open, unlink umount ( 1, 3 4, ). exec , - . sh script shell ( ), shell' ( exec) "script". , , - . , , "" , "" , . "" - 212 , . exec fork; , fork - - , exec . , - ? , fork exec , UNIX fork (. [Ritchie 84a], .1584). , fork exec , - - , "" - . , , - 7.8. 7.6  , - : () - setuid ( "set user ID" - - , - ). , . , kill. - , exec setuid setuid . setuid , - setuid. setuid , , - , . - , , - , - . , . setuid: setuid(uid) uid - . . , , - , uid , , - . , uid - , uid . . - ( fork) exec. 7.25 , - setuid. , , - , "maury" ( 8319) setuid; - . , "mjb" ( 5088) "maury" , . "mjb" - 213 : uid 5088 euid 8319 fdmjb -1 fdmaury 3 after setuid(5088): uid 5088 euid 5088 fdmjb 4 fdmaury -1 after setuid(8319): uid 5088 euid 8319 getuid geteuid - , +------------------------------------------------------------+ | #include | | main() | | { | | int uid,euid,fdmjb,fdmaury; | | | | uid = getuid(); /* UID */ | | euid = geteuid(); /* UID */| | printf("uid %d euid %d\n",uid,euid); | | | | fdmjb = open("mjb",O_RDONLY); | | fdmaury = open("maury",O_RDONLY); | | printf("fdmjb %d fdmaury %d\n",fdmjb,fdmaury); | | | | setuid(uid); | | printf("after setuid(%d): uid %d euid %d\n",uid, | | getuid(),geteuid()); | | | | fdmjb = open("mjb",O_RDONLY); | | fdmaury = open("maury",O_RDONLY); | | printf("fdmjb %d fdmaury %d\n",fdmjb,fdmaury); | | | | setuid(uid); | | printf("after setuid(%d): uid %d euid %d\n",euid, | | getuid(),geteuid()); | | } | +------------------------------------------------------------+ 7.25. setuid "mjb" , , 5088 8319. - "mjb" ( - (8319), ), "maury". setuid, ("mjb") - , , "mjb": 5088. - "mjb", - , , "maury". , - , setuid (8319), - 5088 8319. , , - setuid - , . "maury" : uid 8319 euid 8319 fdmjb -1 fdmaury 3 after setuid(8319): uid 8319 euid 8319 fdmjb -1 fdmaury 4 214 after setuid(8319): uid 8319 euid 8319 - 8319: "maury", "mjb". , - , setuid; . setuid ( ), .. , - . , setuid, (login). setuid , , login . , , , , setuid, , ( "/etc/passwd"). login shell, . setuid- , mkdir. 5.8 , - , . , - , mkdir setuid-, . mkdir , , mknod, - . 7.7  brk . : brk(endds); endds - ( ). , - : oldendds = sbrk(increment); oldendds - , increment - , oldendds - . Sbrk - , brk. , - , ; , - . , - - , , , (- 7.26). , growreg, (, ) , . ; , ( 9). brk , - ; , 215 , . +------------------------------------------------------------+ | brk | | : | | | | : | | | | { | | ; | | ( ) | | ( -| | ) | | { | | ; | | (); | | } | | ( growreg); | | ; | | ; | | } | +------------------------------------------------------------+ 7.26. brk 7.27 , brk, , AT&T 3B20. signal - (segmentation violation), sbrk - - . , , , , , . , sbrk , 256 ; , .. , 3B20, - . , , , , , .. "" (, - ). - , ( 7.27): sbrk - 140924, , 388 , 3B20 2 . - , , , 141312. - 256, 141180 , , . , , 141312. - sbrk , , 2 - , 143360, . , sbrk, . - , , . 216 , - , , brk. , exec, - +-------------------------------------------------------+ | #include | | char *cp; | | int callno; | | | | main() | | { | | char *sbrk(); | | extern catcher(); | | | | signal(SIGSEGV,catcher); | | cp = sbrk(0); | | printf("original brk value %u\n",cp); | | for (;;) | | *cp++ = 1; | | } | | | | catcher(signo); | | int signo; | | { | | callno++; | | printf("caught sig %d %dth call at addr %u\n", | | signo,callno,cp); | | sbrk(256); | | signal(SIGSEGV,catcher); | | } | +-------------------------------------------------------+ +-------------------------------------------+ | original brk value 140924 | | caught sig 11 1th call at addr 141312 | | caught sig 11 2th call at addr 141312 | | caught sig 11 3th call at addr 143360 | | ...( 10- | | sbrk) | | caught sig 11 10th call at addr 143360 | | caught sig 11 11th call at addr 145408 | | ...( 18- | | sbrk) | | caught sig 11 18th call at addr 145408 | | caught sig 11 19th call at addr 145408 | | - | | - | +-------------------------------------------+ 7.27. , brk, . - , - . - , - . - , . 217 +------------------------------------------------------------+ | /* */ | | while (read(stdin,buffer,numchars)) | | { | | /* */ | | if (/* & */) | | amper = 1; | | else | | amper = 0; | | /* , | | shell */ | | if (fork() == 0) | | { | | /* - ? */ | | if (/* */) | | { | | fd = creat(newfile,fmask); | | close(stdout); | | dup(fd); | | close(fd); | | /* stdout */ | | } | | if (/* */) | | { | | pipe(fildes); | | | +------------------------------------------------------------+ 7.28. shell . 7.8 SHELL , - shell. , , , . 7.28 shell, , - . Shell - . , shell', , , - (. 10). shell (, cd, for, while ..), , ; - . - , : who grep -n include *.c ls -l 218 +------------------------------------------------------------+ | if (fork() == 0) | | { | | /* */| | close(stdout); | | dup(fildes[1]); | | close(fildes[1]); | | close(fildes[0]); | | /* - | | */ | | /* - | | */ | | execlp(command1,command1,0); | | } | | /* */ | | close(stdin); | | dup(fildes[0]); | | close(fildes[0]); | | close(fildes[1]); | | /* | | */ | | } | | execve(command2,command2,0); | | } | | /* | | * ... | | * - ,| | * | | * / | | if (amper == 0) | | retid = wait(&status); | | } | +------------------------------------------------------------+ 7.28. shell () Shell "" (fork) , - , . (shell) . ( ), nroff -mm bigdocument & shell (&) amper. shell , , - wait, . , - fork - , shell'. , - , nroff -mm bigdocument > output - ; 219 (, ), - - . - - dup . - . shell . +-----------+ | Shell | +-----+-----+ wait | ^ | | +-----+-----+ exit | wc | +-----+-----+ read | ^ | | +-----+-----+ write | ls - l | +-----------+ 7.29. , - ls -l|wc , shell , . , : ls -l|wc - - . - ; . "" - (ls): , - , , ( - ) . (wc) "" (ls) , shell' (. 7.29). (wc) , - . - . - , . (wc), : , - wc, . Shell . 7.9  , , " ". , : . . - , , , , . , . UNIX 220 - ( ). , - , (, "/unix" , ). - ( start, 7.30). . , -- , , .. - , , . , - . "", fork , - +------------------------------------------------------------+ | start /* */| | : | | : | | { | | ; | | - ; | | 0; | | 1; | | { | | /* 1 */ | | ; | | | | init; | | - | | ; | | - | | , -| | ; | | : | | ; | | /* init -- | | * , | | * init "/etc/init" | | * "" , - | | * | | */ | | } | | /* */ | | ; | | /* , - | | * - | | * . | | * ; -| | * , -| | * . | | */ | | , ; | | } | +------------------------------------------------------------+ 7.30.