BBSˮľÇ廪վ¡Ã¾«»ªÇø
·¢ÐÅÈË: SuperSB (¹ÂÓ¥), ÐÅÇø: Linux
±ê Ìâ: [×ªÔØ]unix»·¾³¸ß¼¶±à³Ì-¸½C
·¢ÐÅÕ¾: BBS ˮľÇ廪վ (Wed Mar 15 14:32:37 2000)
·¢ÐÅÈË: taosm (128+64-->cool), ÐÅÇø: unix
±ê Ìâ: unix»·¾³¸ß¼¶±à³Ì--¸½Â¼C ϰÌâ´ð°¸
·¢ÐÅÕ¾: Î÷Ê®°ËBBS (Sat Mar 11 14:37:49 2000), תÐÅ
¸½Â¼C ϰÌâ´ð°¸
µÚÒ»ÕÂ
1.1 ÀûÓÃlsÃüÁîÖеÄÏÂÃæÁ½¸öÑ¡Ï-i--ÏÔʾÎļþ»òĿ¼µÄi½ÚµãÊýÄ¿(¹ØÓÚi½Úµã
ÔÚ4.14½ÚÖлáÏêϸÌÖÂÛ)£»-d--Èç¹û²ÎÊýÊÇһĿ¼£¬Ö»ÁгöÆäÃû×Ö£¬¶ø²»ÊÇĿ¼ÖÐ
µÄËùÓÐÎļþ¡£
Ö´ÐÐÏÂÃæÃüÁîµÄ½á¹ûΪ£º
$ ls -ldi /etc/. /etc/..
3077 drwxr-sr-x 7 bin 2048 Aug 5 20:12 /etc/./
2 drwxr-xr-x 13 root 512 Aug 5 20:11 /etc/../
$ls -ldi /. /..
2 drwxr-xr-x 13 root 512 Aug 5 20:11 /./
2 srwxr-xr-x 13 root 512 Aug 5 20:11 /../ {.ºÍ..µÄµÄi½ÚµãÊý¾ùΪ2
µÄi½ÚµãÊý¾ùΪ2
1.3 ¼ÙÈçperrorµÄptr²ÎÊýÊÇÒ»¸öÖ¸Õ룬Ôòperror¾Í¿ÉÒԸıäptrËùÖ¸´®µÄÄÚÈÝ¡£Ëù
ÒÔÀûÓÃÏÞ¶¨´ÊconstʹµÃperror²»ÄÜÐÞ¸ÄptrËùÖ¸µÄ´®¡£¶østrerrorµÄ²ÎÊýÊÇ´íÎóºÅ
£¬ÓÉÓÚÆäÊÇÕûÊýÀàÐͲ¢ÇÒC´«µÝµÄÊDzÎÊýÖµ£¬Òò´Ëstrerror²»ÄÜÐ޸IJÎÊýµÄÖµ£¬Ò²
¾ÍûÓбØÒªÊ¹ÓÃconstÊôÐÔ¡£
1.4 µ÷ÓÃfflush£¬fprintfºÍvprintfº¯Êý»á¸Ä±äerrnoµÄÖµ¡£Èç¹ûËüµÄÖµ±äÁ˵«Ã»
Óб£´æ£¬Ôò×îÖÕÏÔʾµÄ´íÎóÐÅÏ¢ÊDz»ÕýÈ·µÄ¡£
ÔÚ¹ýÈ¥¿ª·¢Ðí¶à³ÌÐòÖж¼¿ÉÒÔ·¢ÏÖ²»±£´æerrnoµÄÇé¿ö£¬µäÐ͵ĴòÓ¡³öµÄ´íÎóÐÅÏ¢
ÊÇ"Not a typewriter."¡£ÔÚ5.4½ÚÖбê×¼I/O¿â¸ù¾Ý±ê×¼I/OÁ÷ÊÇ·ñÖ¸ÏòÖÕ¶ËÉ豸¶ø
¸Ä±äÁ÷µÄ»º´æÆ÷¡£istty(11.9½Ú)ͨ³£ÓÃÀ´ÅжÏÁ÷ÊÇ·ñÖ¸ÏòÖÕ¶ËÉ豸£¬Èç¹ûÁ÷²»Ö¸
ÏòÖÕ¶ËÉ豸£¬errno¿ÉÄÜÖÃΪENOTTY£¬´Ó¶øÒýÆð¸Ã´íÎó¡£³ÌÐòC.1±íÏÖÁËÕâ¸öÊôÐÔ¡£
#include <stdio.h>
/*
* The following prints errno=25 (ENOTTY) under 4.3BSD and SVR2,
* when stdout is redirected to a file.
* Under SVR4 and 44BSD it works OK.
*/
int
main()
{
int fd;
extern int errno;
if ( (fd = open("/no/such/file", 0)) < 0) {
printf("open error: ");
printf("errno = %d\n", errno);
}
exit(0);
}
³ÌÐò C.1 errnoºÍprintfµÄ½»»¥×÷ÓÃ
Ö´ÐÐÉÏÃæµÄ³ÌÐò£¬½á¹ûΪ£º
$ grep BSD /etc/motd
4.3 BSD UNIX #29: Thu Mar 29 11:14:13 MST 1990
$ a.out
open error: error = 2 {¹¤×÷Õý³££¬stdoutÊÇÒ»¸öÖÕ¶Ë}
$ a.out > temp.foo
$ cat temp.foo
open error: error = 25 {´íÎó}
1.5 2038Äê¡£
1.6 ´óÔ¼248Ìì¡£
µÚ¶þÕÂ
2.1 ÏÂÃæÊÇ4.3+BSDÖÐʹÓõļ¼Êõ¡£ÔÚ<machine/ansi.h> ÖУ¬Óôóд×Öĸ¶¨Òå¿ÉÒÔ
ÔÚ¶à¸öÍ·ÎļþÖгöÏֵĻù±¾Êý¾ÝÀàÐÍ¡£ÀýÈ磺
#ifndef _ANSI_--H_
#define _ANSI_H_
#define _CLOCK_T_ unsigned long
#define _SIZE_T_ unsigned int
¡
#endif /*_ANSI_H_*/
ÒÔÏÂÃæµÄ˳Ðò¿ÉÒÔÔÚÕâ6¸öÍ·ÎļþÖзֱð¶¨Òåsize_t¡£
#ifdef _SIZE_T_
typedef _SIZE_T_ size_t;
#undef _SIZE_T_
#endif
ÕâÑù£¬Êµ¼ÊÉÏÖ»Ö´ÐÐÒ»´Îtypedef¡£
µÚÈýÕÂ
3.1 ËùÓеĴÅÅÌI/O¶¼Òª¾¹ýÄں˵Ŀ黺´æÆ÷£¬Î¨Ò»ÀýÍâµÄÊǶÔÔʼ´ÅÅÌÉ豸µÄI/
O£¬µ«ÊÇÎÒÃDz»¿¼ÂÇÕâÖÖÇé¿ö(Bach [1986] ÖеĵÚÈýÕ½²ÊöÁËÕâÖÖ»º´æÆ÷µÄ²Ù×÷)
¡£¼ÈÈ»read»òwriteµÄÊý¾Ý¶¼Òª±»Äں˻º´æ£¬ÄÇôÊõÓï"ÎÞ»º´æ×°ÖõÄI/O"Ö¸µÄÊÇÔÚ
Óû§µÄ½ø³ÌÖжÔÕâÁ½¸öº¯Êý²»»á×Ô¶¯»º´æ£¬Ã¿´Îread»òwrite¾ÍÒª½øÐÐÒ»´Îϵͳµ÷

3.3 ÿ´Îµ÷ÓÃopenº¯Êý¾Í·ÖÅäÒ»¸öÎļþ±íÏÈç¹ûÁ½´Î´ò¿ªµÄÊÇÏàͬµÄÎļþ£¬ÔòÁ½
¸öÎļþ±íÏîÖ¸ÏòÏàͬµÄv½Úµã¡£µ÷ÓÃdupÒýÓÃÒÑ´æÔÚµÄÎļþ±íÏî(´Ë´¦Ö¸fd1µÄÎļþ±í
Ïî)£¬¼ûͼC.1¡£µ±F_SETFD×÷ÓÃÓÚfd1ʱ£¬Ö»Ó°Ïìfd1µÄÎļþÃèÊö·û±êÖ¾£»F_SETFL×÷
ÓÃÓÚfd1ʱ£¬ÔòÓ°Ïìfd1¼°fd2µÄÎļþÃèÊö·û±êÖ¾¡£
ͼC.1 openºÍdupµÄ½á¹û
3.4 Èç¹ûfdÊÇ1£¬Ö´ÐÐdup2(fd£¬1)ºó·µ»Ø1£¬µ«ÊÇûÓйرÕÃèÊö·û1(²Î¼û3.12½Ú)¡£
µ÷ÓÃ3´Îdup2ºó£¬3¸öÃèÊö·ûÖ¸ÏòÏàͬµÄÎļþ±íÏËùÒÔ²»ÐèÒª¹Ø±ÕÃèÊö·û¡£
Èç¹ûfdÊÇ3£¬µ÷ÓÃ3´Îdup2ºó£¬ÓÐ4¸öÃèÊö·ûÖ¸ÏòÏàͬµÄÎļþ±íÏËùÒÔ¾ÍÐèÒª¹Ø±Õ
ÃèÊö·û3¡£
3.5 shellÊÇ´Ó×óµ½ÓÒ´¦ÀíÃüÁîÐÐ,ËùÒÔ
a.out > outfile 2 >&1
Ê×ÏÈÉèÖñê×¼Êä³öµ½outfile£¬È»ºóÖ´ÐÐdups½«±ê×¼Êä³ö¸´ÖƵ½ÃèÊö·û2(±ê×¼´íÎó
)ÉÏ£¬Æä½á¹ûÊǽ«±ê×¼Êä³öºÍ±ê×¼´íÎóÉèÖÃΪÏàͬµÄÎļþ£¬¼´ÃèÊö·û1ºÍ2Ö¸ÏòÏàͬ
µÄÎļþ±íÏî¡£
¶ø¶ÔÓÚÃüÁîÐÐ
a.out 2 > &1 >outfile
ÓÉÓÚÊ×ÏÈÖ´ÐÐdups£¬ËùÒÔÃèÊö·û2³ÉΪÖÕ¶Ë(¼ÙÉèÃüÁîÊǽ»»¥Ö´ÐеÄ)£¬±ê×¼Êä³öÖØ
¶¨Ïòµ½outfile¡£½á¹ûÊÇÃèÊö·û1Ö¸ÏòoutfileµÄÎļþ±íÏÃèÊö·û2Ö¸ÏòÖն˵ÄÎļþ
±íÏî¡£
3.6 ÕâÖÖÇé¿ö֮ϣ¬ÈÔÈ»¿ÉÒÔÓÃlseekºÍreadº¯Êý¶ÁÎļþÖÐÈκÎÒ»´¦µÄÄÚÈÝ¡£µ«ÊÇ
writeº¯ÊýÔÚдÊý¾Ý֮ǰ»á×Ô¶¯½«ÎļþÆ«ÒÆÁ¿ÉèÖÃΪÎļþ⣬ËùÒÔдÎļþʱֻÄÜ´Ó
Îļþβ¿ªÊ¼£¬²»ÄÜÔÚÈÎÒâλÖá£
µÚËÄÕÂ
4.1 statº¯Êý×ÜÊÇ˳һ¸ö·ûºÅÁ¬½ÓÏòǰ£¬ËùÒÔÐ޸ĺóµÄ³ÌÐò²»»áÏÔʾÎļþÀàÐÍÊÇ"
·ûºÅÁ¬½Ó"¡£ÀýÈ磺/binÊÇ/usr/binµÄÒ»¸ö·ûºÅÁ¬½Ó£¬µ«ÊÇstatº¯ÊýµÄ½á¹ûÖ»ÏÔʾ
/binÊÇÒ»¸öĿ¼£¬¶ø²»ËµÃ÷ËüÊÇÒ»¸ö·ûºÅÁ¬½Ó¡£ÈôÒ»¸ö·ûºÅÁ¬½ÓÖ¸ÏòÒ»²»´æÔÚµÄÎÄ
¼þ£¬Ôòstat³ö´í·µ»Ø¡£
4.2 ½«ÏÂÃæµÄ¼¸ÐÐÓï¾ä¼ÓÈë<ourhdr.h>
#if defined ( S_IFLNK ) && !defined ( S_ISLNK )
#define S_ISLNK ( mode ) ((( mode ) & S_IFMT ) == S_IFLNK )
#endif
ÕâÊÇÒ»¸öÎÒÃDZàдµÄÍ·ÎļþÈçºÎÆÁ±ÎijЩϵͳ²î±ðµÄʵÀý¡£
4.3 ¹Ø±ÕÁ˸ÃÎļþµÄËùÓдæÈ¡È¨ÏÞ¡£
$ umask 777
$ data > temp.foo
$ ls -l temp.foo
---------- l stevens 29 Jan 14
6:39 temp.foo
4.4 ÏÂÃæµÄÃüÁî±íʾ¹Ø±ÕÓû§¶ÁȨÏÞµÄÇé¿ö¡£
$ data > foo
$ chmod u-r foo {¹Ø±ÕÓû
¶ÁȨÏÞ}
$ ls -l foo
ÑéÖ¤ÎļþµÄȨÏÞ}
--w-rw-r-- l stevens 29 Jul 31 09:00
oo
$ cat foo
{¶ÁÎļþ}
cat: foo: Permission denied
4.5 Èç¹ûÓÃopen»òcreat´´½¨ÒѾ´æÔÚµÄÎļþ£¬Ôò¸ÃÎļþµÄ´æÈ¡È¨ÏÞ²»±ä¡£Í¨¹ý³Ì
Ðò4.3¿ÉÒÔÑéÖ¤Õâµã¡£
$ rm foo bar
ɾ³ýÎļþ}
$ data > foo
´´½¨Îļþ}
$ data > bar
$ chmod a-r foo bar {¹Ø±ÕËùÓ
µÄ¶ÁȨÏÞ}
$ ls -l foo bar {ÑéÖ¤ÆäÈ
ÏÞ}
--w--w---- l stevens 29 Jul 31 10:47
ar
--w--w---- l stevens 29 Jul 31 10:47
oo
$ a.out
ÔËÐгÌÐò4.3}
$ ls -l foo bar {¼ì²éÎļþµÄȨÏÞº
´óС}
--w--w---- l stevens 0 Jul 31 10:47 bar
--w--w---- l stevens 0 Jul 31 10:47
oo
¿ÉÒÔ¿´³ö´æÈ¡È¨ÏÞûÓиı䣬µ«ÊÇÎļþ³¤¶ÈËõ¶ÌÁË¡£
4.6 Ŀ¼µÄ³¤¶È´ÓÀ´²»»áÊÇ0£¬ÒòΪËü×ÜÊǰüº¬ .ºÍ ..Á½Ïî¡£·ûºÅÁ¬½ÓµÄ³¤¶ÈÖ¸Æä
·¾¶ÃûµÄ°üº¬µÄ×Ö·ûÊý£¬ÓÉÓÚ·¾¶ÃûÖÐÖÁÉÙÓÐÒ»¸ö×Ö·û£¬ËùÒÔ³¤¶ÈÒ²²»Îª0¡£
4.8 µ±´´½¨ÐµÄcoreÎļþʱ£¬ÄÚºË¶ÔÆä´æÈ¡È¨ÏÞÓÐÒ»¸öĬÈÏÉèÖã¬ÔÚ±¾ÀýÖÐÊÇ£ºr
w-r--r--¡£Õâһȱʡֵ¿ÉÄÜ»áÒ²Ðí²»»á±»umaskµÄÖµÐ޸ġ£Shell¶Ô´´½¨µÄÖØ¶¨ÏòµÄ
ÐÂÎļþÒ²ÓÐÒ»¸öĬÈϵķÃÎÊȨÏÞ£¬±¾ÀýÖÐΪrw-rw-rw-¡£Õâ¸öÖµ×ÜÊDZ»µ±Ç°µÄumas
kÐ޸ģ¬ÔÚ±¾ÀýÖÐumaskΪ02¡£
4.9 ²»ÄÜʹÓÃduµÄÔÒòÊÇËüÐèÒªÎļþÃû»òĿ¼Ãû×÷Ϊ²ÎÊý£¬ÀýÈ磺
du tempfile
du .
Ö»Óе±unlinkº¯Êý·µ»ØÊ±²ÅÊÍ·ÅtempfileµÄĿ¼ÏduÃüÁîûÓмÆËãÈÔÈ»±»temp
fileÕ¼ÓõĿռ䡣ÔÚ±¾ÀýÖÐÖ»ÄÜʹÓÃdfÃüÁî²ì¿´ÎļþϵͳÖÐʵ¼Ê¿ÉÓõÄ×ÔÓɿռ䡣
4.10 Èç¹û±»unlinkµÄÁ´½Ó²»ÊǸÃÎļþµÄ×îºóÒ»¸öÁ´½Ó£¬¸ÃÎļþ²»»áɾ³ý¡£´Ëʱ£¬
unlinkº¯Êý¸üÐÂÎļþµÄ״̬¸Ä±äʱ¼ä¡£Èç¹ûÊÇ×îºóÒ»¸öÁ´½Ó£¬¸ÃÎļþ½«±»ÎïÀíɾ³ý
¡£ÕâʱÔÙÈ¥¸üÐÂÎļþµÄ״̬¸Ä±äʱ¼ä¾ÍûÓÐÒâÒ壬ÒòΪ°üº¬ÎļþËùÓÐÐÅÏ¢µÄi½Úµã
½«»áËæ×ÅÎļþµÄɾ³ý¶ø±»ÊÍ·Å¡£
4.11 ÓÃopendir´ò¿ªÒ»¸öĿ¼ºó£¬Ñ»·µ÷Óú¯Êýdopath¡£¼ÙÉèopendirʹÓÃÒ»¸öÎÄ
¼þÃèÊö·û£¬²¢ÇÒÖ»Óд¦ÀíÍêĿ¼ºóµ÷ÓÃclosedir²ÅÊÍ·ÅÃèÊö·û£¬Õâ¾ÍÒâζ×Åÿ´Î´ò
¿ªÄ¿Â¼¾ÍÒª½µÒ»¼¶Ê¹ÓÃÁíÍâÒ»¸öÃèÊö·û¡£ËùÒÔϵͳ¿É´ò¿ªÎļþÊý¾ÍÏÞÖÆÁËÎļþϵͳ
ÖÐÊ÷µÄÉî¶È¡£SVR4ÖеÄftwÔÊÐíµ÷ÓÃÕßÖ¸¶¨Ê¹ÓõÄÃèÊö·ûÊý£¬ÕâÒþº¬×ŸÃʵÏÖ¿ÉÒÔ
¹Ø±ÕÃèÊö·û²¢ÇÒÖØÓÃËüÃÇ¡£
4.13 chrootº¯ÊýÓÃÓÚ¸¨ÖúInternetÎļþ´«Êä³ÌÐò(FTP)ÖеݲȫÐÔ¡£ÏµÍ³ÖÐûÓÐÕÊ
ºÅµÄÓû§(Ò²³ÆÎªÄäÃûFTP)·ÅÔÚÒ»¸öµ¥¶ÀµÄĿ¼Ï£¬ÀûÓÃchroot½«´ËĿ¼µ±×÷еÄ
¸ùĿ¼¾Í¿ÉÒÔ×èÖ¹Óû§·ÃÎÊ´ËĿ¼ÒÔÍâµÄÎļþ¡£
chrootÒ²ÓÃÓÚÔÚÁíһ̨»úÆ÷ÉϹ¹ÔìÒ»Îļþϵͳ²ã´Î½á¹¹µÄÒ»¸ö¸±±¾£¬È»ºóÐ޸ĴË
¸±±¾£¬µ«²»¸ü¸ÄÔÀ´µÄÎļþϵͳ¡£Õâ¿ÉÓÃÔ¤²âÊÇÐÂÈí¼þ°ü×°µÈ³¡ºÏ¡£ChrootÖ»ÄÜÓÐ
³¬¼¶Óû§Ê¹Óã¬Ò»µ©¸ü¸ÄÁËÒ»¸ö½ø³ÌµÄroot£¬¸Ã½ø³Ì¼°Æäºó´ú½ø³Ì¾ÍÔÙÒ²²»Äָܻ´
ÖÁÔÏȵÄroot¡£
4.14 Ê×Ïȵ÷ÓÃstatº¯ÊýÈ¡µÃÎļþµÄÈý¸öʱ¼äÖµ£¬È»ºóµ÷ÓÃutimeÉèÖÃÆÚÍûµÄÖµ¡£ÎÒ
ÃDz»Ï£ÍûÔÚµ÷ÓÃutime¸Ä±äµÄÖµ¾ÍÊÇstatÖÐÏàÓ¦µÄÖµ¡£
4.15 finger(1)¶ÔÓÊÏäµ÷ÓÃstatº¯Êý£¬×î½üÒ»´ÎµÄÐÞ¸Äʱ¼äÊÇÉÏÒ»´Î½ÓÊÕÓʼþµÄʱ
¼ä£¬×î½ü·ÃÎÊʱ¼äÊÇÉÏÒ»´Î¶ÁÓʼþµÄʱ¼ä¡£
4.16 ¶ÔcpioÀ´Ëµ£¬¼È¿ÉÒԸıäÎļþµÄ·ÃÎÊʱ¼ä(st_atime)ºÍÐÞ¸Äʱ¼ä(st_mtime)
Ò²¿ÉÒÔ¶¼²»¸Ä±ä¡£cpioµÄ-aÑ¡Ïî¿ÉÒÔÔÚ¶ÁÎļþºóÖØÐÂÉèÖÃÎļþµÄ·ÃÎÊʱ¼äΪ¶ÁÎļþ
ǰµÄʱ¼ä£¬ËùÒÔcpio¿ÉÒÔ²»¸Ä±äÎļþµÄ·ÃÎÊʱ¼ä¡£ÁíÒ»·½Ã棬-mÑ¡ÏÎļþµÄÐÞ¸Ä
ʱ¼ä±£´æÎªÔÀ´µÄÐÞ¸Äʱ¼ä¡£
¶ÔtarÀ´Ëµ£¬ÔÚ³éÈ¡Îļþʱ£¬Æäȱʡ·½Ê½ÊǸ´Ô¹éµµÊ±µÄÐÞ¸Äʱ¼ä£¬µ«ÊÇ-mÑ¡ÏîÔò
½«ÐÞ¸Äʱ¼äÉèÖÃΪ³éÈ¡ÎļþʱµÄʱ¼ä¡£ÎÞÂÛtarÔÚºÎÖÖÇé¿ö£¬ÎļþµÄ·ÃÎÊʱ¼ä¾ùÊÇ
³éÈ¡ÎļþʱµÄʱ¼ä¡£
ÓÉÓÚ²»ÄÜÐÞ¸Ä״̬¸Ä±äʱ¼ä(utimeÒ²Ö»Äܸıä·ÃÎÊʱ¼äºÍÐÞ¸Äʱ¼ä)£¬ËùÒÔûÓн«
Æä±£´æÔÚÎĵµÉÏ¡£
4.17 read¸Ä±äÁËÎļþ·ÃÎÊʱ¼ä£¬ÎªÁËÏû³ýÕâÒ»Ó°Ï죬ÓÐЩ°æ±¾µÄfile(1)µ÷ÓÃuti
me»Ö¸´ÎļþµÄ·ÃÎÊʱ¼ä£¬µ«ÊÇÕâÑù×ö»áÐÞ¸ÄÎļþµÄ״̬¸Ä±äʱ¼ä¡£
4.18 Äں˶ÔĿ¼µÄÉî¶ÈûÓÐÄÚÔÚµÄÏÞÖÆ£¬µ«ÊÇÈç¹û·¾¶ÃûµÄ³¤¶È³¬³öÁËPATH_MAX
ÓÐÐí¶àÃüÁî»áʧ°Ü¡£³ÌÐòC.2´´½¨ÁËÒ»¸öÉî¶ÈΪ100µÄĿ¼Ê÷£¬Ã¿Ò»¼¶Ä¿Â¼ÃûÓÐ45¸ö
×Ö·û¡£ÀûÓÃgetcwd¿ÉÒԵõ½µÚ100¼¶Ä¿Â¼µÄ¾ø¶Ô·¾¶Ãû(ÐèÒª¶à´Îµ÷ÓÃreallocÉêÇë
Ò»¸ö×ã¹»´óµÄ»º´æ)¡£
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "ourhdr.h"
#define DEPTH 100 /* directory depth */
#define MYHOME "/home/stevens"
#define NAME "alonglonglonglonglonglonglonglonglonglongname"
int
main(void)
{
int i, size;
char *path;
if (chdir(MYHOME) < 0)
err_sys("chdir error");
for (i = 0; i < DEPTH; i++) {
if (mkdir(NAME, DIR_MODE) < 0)
err_sys("mkdir failed, i = %d", i);
if (chdir(NAME) < 0)
err_sys("chdir failed, i = %d", i);
}
if (creat("afile", FILE_MODE) < 0)
err_sys("creat error");
/*
* The deep directory is created, with a file at the leaf.
* Now let's try and obtain its pathname.
*/
path = path_alloc(&size);
for ( ; ; ) {
if (getcwd(path, size) != NULL)
break;
else {
err_ret("getcwd failed, size = %d", size);
size += 100;
if ( (path = realloc(path, size)) == NULL)
err_sys("realloc error");
}
}
printf("length = %d\n%s\n", strlen(path), path);
exit(0);
}
³ÌÐòC.2 ´´½¨Éî¶ÈĿ¼
ÔËÐкóµÃµ½£º
$ a.out
getcwd failed, size = 1025: Result too large
getcwd failed, size = 1125: Result too large
¡ { 33ÐÐ}
getcwd failed, size = 4525: Result too large
length = 4613
{ÏÔʾ4613×ֽڵķ¾¶Ãû}
µ«ÊÇÓÉÓÚÎļþÃûÌ«³¤ÁË£¬²»ÄÜÓÃtar»òcpio¶Ô¸ÃĿ¼½¨Á¢µµ°¸Îļþ£¬¶øÇÒÒ²²»ÄÜÓÃ
rm -rÃüÁîɾ³ý¸ÃĿ¼¡££¨ÎÒÃÇÔõÑù²ÅÄÜɾ³ý¸ÃĿ¼Ê÷£¿£©
4.19 /devĿ¼¹Ø±ÕÁËÒ»°ãÓû§µÄдȨÏÞ£¬ËùÒÔÓû§²»ÄÜɾ³ýĿ¼ÖеÄÎļþ£¬¼´un
linkʧ°Ü¡£
µÚÎåÕÂ
5.2 fgetsº¯Êý¶ÁÈëÊý¾Ý£¬Ö±µ½ÐнáÊø»ò»º³åÇøÂú(µ±È»»áÁô³öÒ»¸ö×Ö½Ú´æ·Å'\0')
¡£Í¬Ñù£¬fputsÖ»¸ºÔ𽫻º³åÇøµÄÄÚÈÝÊä³ö£¬¶ø²¢²»¿¼ÂÇ»º³åÇøÖÐÊÇ·ñ°üº¬»»Ðзû
¡£ËùÒÔ£¬Èç¹û½«MAXLINEÉèµÃºÜС£¬ÕâÁ½¸öº¯ÊýÈÔÈ»»áÕý³£¹¤×÷£¬Ö»²»¹ý±»Ö´ÐеÄ
´ÎÊýÒª±ÈMAXLINEÖµ½Ï´óµÄʱºò¶à¡£
5.3 µ±printfûÓÐÊä³öÈκÎ×Ö·ûʱ£¬È磺printf("") £¬·µ»Ø0¡£
5.4 ÕâÊÇÒ»¸ö±È½Ï³£¼ûµÄ´íÎó¡£getcÒÔ¼°getcharµÄ·µ»ØÖµÊÇÕûÐÍ£¬¶ø²»ÊÇ×Ö·ûÐÍ
¡£ÓÉÓÚEOF¾³£¶¨ÒåΪ-1£¬ÄÇôÈç¹ûϵͳʹÓõÄÊÇÓзûºÅµÄ×Ö·ûÀàÐÍ£¬³ÌÐò»¹¿ÉÒÔ
Õý³£¹¤×÷¡£µ«Èç¹ûʹÓõÄÊÇÎÞ·ûºÅ×Ö·ûÀàÐÍ£¬ÄÇô·µ»ØµÄEOF±»±£´æµ½×Ö·ûcºó½«²»
ÔÙÊÇ-1£¬ËùÒÔ£¬³ÌÐò»á½øÈëËÀÑ»·¡£
5.5 5¸ö×Ö·û³¤µÄǰ׺¡¢4¸ö×Ö·û³¤µÄ½ø³ÌÄÚΨһ±êʶÔÙ¼Ó5¸ö×Ö·û³¤µÄϵͳÄÚΨһ
±êʶ(½ø³ÌID)¸ÕºÃ×é³É14λµÄUNIX´«Í³Îļþ³¤¶ÈÏÞÖÆ¡£
5.6 ʹÓ÷½·¨Îª£ºÏȵ÷ÓÃfflushºóµ÷ÓÃfsync£¬fsyncËùʹÓõIJÎÊýÓÉfilenoº¯Êý»ñ
µÃ¡£Èç¹û²»µ÷ÓÃfflush£¬ËùÓеÄÊý¾ÝÈÔÈ»ÔÚÄڴ滺³åÇøÖУ¬´Ëʱµ÷ÓÃfsync½«Ã»ÓÐ
ÈκÎЧ¹û¡£
5.7 µ±³ÌÐò½»»¥ÔËÐÐʱ£¬±ê×¼ÊäÈëÊä³öÉ豸¾ùΪÐлº³å·½Ê½¡£Ã¿´Îµ÷ÓÃfgetsʱ±ê
×¼Êä³öÉ豸½«×Ô¶¯Ë¢Çå¡£
µÚÁùÕÂ
6.1 ÔÚSVR4ϵͳÖУ¬Óû§ÊÖ²áÖн²ÊöÁË»ñÈ¡ÒõÓ°ÃÜÂëÎļþµÄº¯Êý¡£ÎÒÃDz»ÄÜʹÓÃ6
.2½ÚËùÊöº¯Êý·µ»ØµÄpw_passwd±äÁ¿À´±È½Ï¼ÓÃܵĿÚÁî¡£ÕýÈ·µÄ·½·¨ÊÇʹÓÃÒõÓ°ÃÜ
ÂëÎļþÖжÔÓ¦Óû§µÄ¼ÓÃÜ¿ÚÁîÀ´½øÐбȽϡ£
ÔÚ4.3+ BSDϵͳÖУ¬ÃÜÂëÎļþµÄÒõÓ°ÊÇ×Ô¶¯½¨Á¢µÄ¡£½öµ±µ÷ÓÃÕßµÄÓû§IDΪ0ʱ£¬
getpwnam»ògetpwuidº¯Êý·µ»ØµÄpassed½á¹¹ÖеÄpw_passwd×ֶβŰüº¬ÓмÓÃܵĿÚ
Áî¡£
6.2 ÔÚSVR4ϵͳÖУ¬³ÌÐòC.3½«Êä³ö¼ÓÃܵĿÚÁî¡£µ±È»£¬³ý·ÇÓг¬¼¶Óû§È¨ÏÞ£¬·ñ
Ôòµ÷ÓÃgetspnam½«·µ»ØEACCESS´íÎó¡£
#include <sys/types.h>
#include <shadow.h>
#include "ourhdr.h"
int
main(void) /* SVR4 version */
{
struct spwd *ptr;
if ( (ptr = getspnam("stevens")) == NULL)
err_sys("getspnam error");
printf("sp_pwdp = %s\n",
ptr->sp_pwdp == NULL || ptr->sp_pwdp[0] == 0 ?
"(null)" : ptr->sp_pwdp);
exit(0);
}
³ÌÐòC.3 ÔÚSVR4ϵͳÖÐÊä³ö¼ÓÃܵĿÚÁî
ÔÚ4.3+ BSDϵͳÖУ¬¾ßÓг¬¼¶Óû§È¨ÏÞʱ£¬³ÌÐòC.4½«Êä³ö¼ÓÃܵĿÚÁî¡£·ñÔòpw_
passedµÄ·µ»ØÖµÎªÐǺÅ(*)¡£
#include <sys/types.h>
#include <pwd.h>
#include "ourhdr.h"
int
main(void) /* 44BSD version */
{
struct passwd *ptr;
if ( (ptr = getpwnam("stevens")) == NULL)
err_sys("getpwnam error");
printf("pw_passwd = %s\n",
ptr->pw_passwd == NULL || ptr->pw_passwd[0] == 0
?
"(null)" : ptr->pw_passwd);
exit(0);
}
³ÌÐòC.4 ÔÚ4.3+ BSDϵͳÖÐÊä³ö¼ÓÃܵĿÚÁî
6.4
#include <time.h>
#include "ourhdr.h"
int
main(void)
{
time_t caltime;
struct tm *tm;
char line[MAXLINE];
if ( (caltime = time(NULL)) == -1)
err_sys("time error");
if ( (tm = localtime(&caltime)) == NULL)
err_sys("localtime error");
if (strftime(line, MAXLINE, "%a %b %d %X %Z %Y\n", tm) == 0)
err_sys("strftime error");
fputs(line, stdout);
exit(0);
}
³ÌÐòC.5 ÒÔdate(1)µÄ¸ñʽÊä³öÈÕÆÚºÍʱ¼ä
³ÌÐòC.5µÄÔËÐнá¹ûÈçÏ£º
$ echo $TZ
MST7
$ a.out
Wed Jan 15 06:48:57 MST 1992
$ TZ=EST5EDT a.out U.S.East Coast
Wed Jan 15 08:49:06 EST 1992
$ TZ=JST-9 a.out Japan
Wed Jan 15 22:49:12 JST 1992
µÚÆßÕÂ
7.1 ÔÒòÔÚÓÚprintfµÄ·µ»ØÖµ(Êä³öµÄ×Ö·ûÊý)±ä³ÉÁËmainº¯ÊýµÄ·µ»ØÂë¡£µ±È»£¬²¢
²»ÊÇËùÓеÄϵͳ¶¼»á³öÏÖ¸ÃÇé¿ö¡£
7.2 µ±³ÌÐò´¦ÓÚ½»»¥ÔËÐз½Ê½Ê±£¬±ê×¼Êä³öÉ豸ͨ³£´¦ÓÚÐлº³å·½Ê½£¬ËùÒÔµ±¼üÈë
ÐÂÐзûʱ£¬ÉϴεĽá¹û²Å±»ÕæÕýÊä³ö¡£Èç¹û±ê×¼Êä³öÉ豸±»¶¨Ïòµ½Ò»¸öÎļþ¶ø´¦ÓÚ
ÍêÈ«»º³å·½Ê½£¬Ôòµ±±ê×¼I/OÇåÀí²Ù×÷Ö´ÐÐʱ£¬½á¹û²ÅÕæÕý±»Êä³ö¡£
7.3 ÓÉÓÚagrcºÍargv²»ÏóenvironÒ»Ñù±£´æÔÚÈ«¾Ö±äÁ¿ÖУ¬ËùÒÔÔÚ´ó¶àÊýUnixϵͳ
ÖÐûÓÐÆäËü°ì·¨¡£
7.4 µ±C³ÌÐò¸´ÒýÓÃÒ»¸ö¿ÕÖ¸Õë³ö´íʱ£¬Ö´ÐиóÌÐòµÄ½ø³Ì½«ÖÕÖ¹£¬ÓÚÊÇ¿ÉÒÔÀûÓÃ
ÕâÖÖ·½·¨ÖÕÖ¹½ø³Ì¡£
7.5 ¶¨ÒåÈçÏ£º
typedef void Exitfunc ( void ) ;
int atexit ( Exitfunc *func ) ;
7.6 calloc½«·ÖÅäµÄÄÚ´æ¿Õ¼ä³õʼ»¯Îª0¡£µ«ÊÇANSI C²¢²»±£Ö¤0ÖµÓ븡µã0»ò¿ÕÖ¸
ÕëµÄÖµÏàͬ¡£
7.7 Ö»ÓÐͨ¹ýexecº¯ÊýÖ´ÐÐÒ»¸ö³ÌÐòʱ£¬²Å»á·ÖÅä¶ÑºÍ¶ÑÕ»¡£
7.8 ¿ÉÖ´ÐÐÎļþ°üº¬ÁËÓÃÓÚµ÷ÊÔcoreÎļþµÄ·ûºÅ±íÐÅÏ¢£¬ÓÃstrip(1)¿ÉÒÔɾ³ýÕâЩ
ÐÅÏ¢£¬¶ÔÁ½¸öa.outÎļþÖ´ÐÐÕâÌõÃüÁËüÃǵĴóС¼õΪ98304ºÍ16384¡£
7.9 ûÓÐʹÓù²Ïí¿âʱ£¬¿ÉÖ´ÐÐÎļþµÄ´ó²¿·Ö¶¼±»±ê×¼I/O¿âËùÕ¼Óá£
7.10 Õâ¶Î´úÂë²»ÕýÈ·¡£ÒòΪÔÚifÓï¾äÖж¨ÒåÁË×Ô¶¯±äÁ¿val£¬ËùÒÔµ±ifÖеĸ´ºÏÓï
¾ä½áÊøÊ±£¬¸Ã±äÁ¿¾Í²»´æÔÚÁË£¬µ«ÊÇÔÚifÓï¾äÖ®ÍâÓÖÓÃÖ¸ÕëÒýÓÃÒѾ²»´æÔÚµÄ×Ô¶¯
±äÁ¿val¡£
µÚÆßÕÂ
7.1 ÔÒòÔÚÓÚprintfµÄ·µ»ØÖµ(Êä³öµÄ×Ö·ûÊý)±ä³ÉÁËmainº¯ÊýµÄ·µ»ØÂë¡£µ±È»£¬²¢
²»ÊÇËùÓеÄϵͳ¶¼»á³öÏÖ¸ÃÇé¿ö¡£
7.2 µ±³ÌÐò´¦ÓÚ½»»¥ÔËÐз½Ê½Ê±£¬±ê×¼Êä³öÉ豸ͨ³£´¦ÓÚÐлº³å·½Ê½£¬ËùÒÔµ±¼üÈë
ÐÂÐзûʱ£¬ÉϴεĽá¹û²Å±»ÕæÕýÊä³ö¡£Èç¹û±ê×¼Êä³öÉ豸±»¶¨Ïòµ½Ò»¸öÎļþ¶ø´¦ÓÚ
ÍêÈ«»º³å·½Ê½£¬Ôòµ±±ê×¼I/OÇåÀí²Ù×÷Ö´ÐÐʱ£¬½á¹û²ÅÕæÕý±»Êä³ö¡£
7.3 ÓÉÓÚagrcºÍargv²»ÏóenvironÒ»Ñù±£´æÔÚÈ«¾Ö±äÁ¿ÖУ¬ËùÒÔÔÚ´ó¶àÊýUnixϵͳ
ÖÐûÓÐÆäËü°ì·¨¡£
7.4 µ±C³ÌÐò¸´ÒýÓÃÒ»¸ö¿ÕÖ¸Õë³ö´íʱ£¬Ö´ÐиóÌÐòµÄ½ø³Ì½«ÖÕÖ¹£¬ÓÚÊÇ¿ÉÒÔÀûÓÃ
ÕâÖÖ·½·¨ÖÕÖ¹½ø³Ì¡£
7.5 ¶¨ÒåÈçÏ£º
typedef void Exitfunc ( void ) ;
int atexit ( Exitfunc *func ) ;
7.6 calloc½«·ÖÅäµÄÄÚ´æ¿Õ¼ä³õʼ»¯Îª0¡£µ«ÊÇANSI C²¢²»±£Ö¤0ÖµÓ븡µã0»ò¿ÕÖ¸
ÕëµÄÖµÏàͬ¡£
7.7 Ö»ÓÐͨ¹ýexecº¯ÊýÖ´ÐÐÒ»¸ö³ÌÐòʱ£¬²Å»á·ÖÅä¶ÑºÍ¶ÑÕ»¡£
7.8 ¿ÉÖ´ÐÐÎļþ°üº¬ÁËÓÃÓÚµ÷ÊÔcoreÎļþµÄ·ûºÅ±íÐÅÏ¢£¬ÓÃstrip(1)¿ÉÒÔɾ³ýÕâЩ
ÐÅÏ¢£¬¶ÔÁ½¸öa.outÎļþÖ´ÐÐÕâÌõÃüÁËüÃǵĴóС¼õΪ98304ºÍ16384¡£
7.9 ûÓÐʹÓù²Ïí¿âʱ£¬¿ÉÖ´ÐÐÎļþµÄ´ó²¿·Ö¶¼±»±ê×¼I/O¿âËùÕ¼Óá£
7.10 Õâ¶Î´úÂë²»ÕýÈ·¡£ÒòΪÔÚifÓï¾äÖж¨ÒåÁË×Ô¶¯±äÁ¿val£¬ËùÒÔµ±ifÖеĸ´ºÏÓï
¾ä½áÊøÊ±£¬¸Ã±äÁ¿¾Í²»´æÔÚÁË£¬µ«ÊÇÔÚifÓï¾äÖ®ÍâÓÖÓÃÖ¸ÕëÒýÓÃÒѾ²»´æÔÚµÄ×Ô¶¯
±äÁ¿val¡£
µÚ°ËÕÂ
8.1 ÓÃÏÂÃæ¼¸ÐдúÌæ³ÌÐò8.2Öе÷ÓÃprintfµÄÓï¾ä¡£
i = printf ("pid = %d, glob = %d, var = %d\n", getpid( ), glob, var);
sprintf (buf, "%d\n", i);
write (STDOUT_FILENO, buf, strlen(buf));
×¢ÒâÒª¶¨Òå±äÁ¿iºÍbuf¡£
ÕâÀï¼ÙÉè×Ó½ø³Ìµ÷ÓÃexitʱֻ¹Ø±Õ±ê×¼I/OÁ÷£¬²¢²»¹Ø±ÕÓë±ê×¼Êä³öÏà¹ØµÄÎļþÃè
Êö·ûSTDOUT_FILENO¡£ÓÐЩ°æ±¾µÄ±ê×¼I/O¿â»á¹Ø±ÕÓë±ê×¼Êä³öÏà¹ØµÄÎļþÃèÊö·û´Ó
¶øÒýÆðдʧ°Ü£¬ÕâÖÖÇé¿ö¾Íµ÷ÓÃdup½«±ê×¼Êä³ö¸´ÖƵ½ÁíÒ»¸öÃèÊö·û£¬writeÔòʹÓÃ
и´ÖƵÄÎļþÃèÊö·û¡£
8.2 ÎÒÃÇ¿ÉÒÔͨ¹ý³ÌÐòC.6À´ËµÃ÷Õâ¸öÎÊÌâ¡£
#include <sys/types.h>
#include "ourhdr.h"
static void f1(void), f2(void);
int
main(void)
{
f1();
f2();
_exit(0);
}
static void
f1(void)
{
pid_t pid;
if ( (pid = vfork()) < 0)
err_sys("vfork error");
/* child and parent both return */
}
static void
f2(void)
{
char buf[1000]; /* automatic variables */
int i;
for (i = 0; i < sizeof(buf); i++)
buf[i] = 0;
}
³ÌÐòC.6 ´íÎóʹÓÃvforkµÄÀý×Ó
ͼC.2 µ÷ÓÃvforkʱµÄÕ»Ö¡
µ±º¯Êýf1µ÷ÓÃvforkʱ£¬¸¸½ø³ÌµÄ¶ÑÕ»Ö¸Õë¾ÍÖ¸Ïòf1µÄÕ»Ö¡£¬¼ûͼC.2¡£vforkʹµÃ
×Ó½ø³ÌÏÈÖ´ÐÐÈ»ºó´Óf1·µ»Ø£¬½Ó×Å×Ó½ø³Ìµ÷ÓÃf2²¢ÇÒ¸²¸ÇÁËf1µÄ¶ÑÕ»Çø¼ä£¬ÔÚf2ÖÐ
×Ó½ø³Ì½«×Ô¶¯±äÁ¿bufµÄÖµÖÃΪ0£¬¼´½«¶ÑÕ»ÖеÄ1000¸ö×Ö½ÚµÄÖµ¶¼ÖÃΪ0¡£´Óf2·µ
»Øºó¸¸½ø³Ì¼ÌÐøÖ´Ðе÷ÓÃ_exit£¬Õâʱ¶ÑÕ»ÖÐmainÒÔϵÄÄÚÈÝÒѾ±»f2ÐÞ¸ÄÁË£¬µ«
ÊǸ¸½ø³ÌÈÔÈ»ÒÔΪµ÷ÓÃÁËvforkºó´Óf1·µ»Ø¡£·µ»ØÐÅÏ¢ËäÈ»±£´æÔÚ¶ÑÕ»ÖУ¬µ«ÊÇ¿É
ÄÜÒѾ±»×Ó½ø³ÌÐÞ¸ÄÁË¡£¶ÔÕâ¸öÀý×Ó£¬¸¸½ø³Ì¼ÌÐøÖ´ÐеĽá¹ûÒªÒÀÀµÓÚʵ¼ÊµÄUni
xϵͳ¡£(È磺·µ»ØÐÅÏ¢±£´æÔÚ¶ÑÕ»µÄ¾ßÌåλÖã¬Ð޸Ķ¯Ì¬±äÁ¿Ê±¸²¸ÇÁËÄÄЩÐÅÏ¢µÈ
µÈ¡£)ͨ³£µÄ½á¹ûÊÇÒ»¸öcoreÎļþ¡£
8.3 ³ÌÐò8.7ÖÐÎÒÃÇÏÈÈø¸½ø³ÌÊä³ö£¬µ«Êǵ±¸¸½ø³ÌÊä³öÍê±Ï×Ó½ø³ÌÒªÊä³öʱ£¬ÎÒ
ÃÇÒªÈø¸½ø³ÌÖÕÖ¹¡£ÊÇ·ñ¸¸½ø³ÌÏÈÖÕÖ¹»òÊÇ×Ó½ø³ÌÏÈÖ´ÐÐÊä³öÒªÒÀÀµÓÚÄں˶ÔÁ½¸ö
½ø³ÌµÄµ÷¶È¡£shellÔÚ¸¸½ø³ÌÖÕÖ¹ºó»á¿ªÊ¼Ö´ÐÐÆäËü³ÌÐò£¬ÕâÑùÒ²ÐíÈÔ»áÓ°Ïì×Ó½ø
³Ì¡£Òª±ÜÃâÕâÖÖÇé¿ö¾ÍÊÇÔÚ×Ó½ø³ÌÍê³ÉÊä³öºó²ÅÖÕÖ¹¸¸½ø³Ì¡£ÓÃÏÂÃæµÄÓï¾äÌæ»»³Ì
ÐòÖÐforkºóÃæµÄ´úÂë¡£ÓÉÓÚÖ»ÓÐÖÕÖ¹¸¸½ø³Ì²ÅÄÜ¿ªÊ¼ÏÂÒ»¸ö³ÌÐò£¬ËùÒÔ²»»á³öÏÖÉÏ
ÃæµÄÇé¿ö¡£
else if ( pid == 0 ) {
WAIT_PARENT( ) ;
/*parent goes first */
charatatime ( "output form child\n" ) ;
TELL_PARENT ( getppid( )) ;
* tell parent we're done */
} else {
charatatime ( "output from parent\n" ) ;
TELL_CHILD ( pid ) ;
* tell child we're done */
WAIT_CHILD ( ) ;
/* wait for child to finish */
8.4 ¶Ôargv[2]´òÓ¡µÄÊÇÏàͬµÄÖµ£¨/home/stevens/bin/testinterp£©¡£ÔÒòÊÇex
eclpÔÚ½áÊøÊ±µ÷ÓÃÁËexecve£¬²¢ÇÒÓëÖ±½Óµ÷ÓÃexeclµÄ·¾¶ÃûÏàͬ¡£
8.5²»Ìṩ·µ»Ø±£´æµÄÓû§IDµÄº¯Êý£¬ÎÒÃDZØÐëÔÚ½ø³Ì¿ªÊ¼Ê±±£´æÓÐЧµÄÓû§ID¡£
8.6 ³ÌÐòC.7´´½¨ÁËÒ»¸özombie¡£
#include "ourhdr.h"
int
main(void)
{
pid_t pid;
if ( (pid = fork()) < 0)
err_sys("fork error");
else if (pid == 0) /* child */
exit(0);
/* parent */
sleep(4);
system("ps");
exit(0);
}
³ÌÐòC.7 ´´½¨Ò»¸özombie²¢ÓÃps²é¿´Æä״̬
Ö´ÐгÌÐò½á¹ûÈçÏ£¨ps£¨1£©ÓÃ"Z"±íʾZombie£©£º
$ a.out
PID TT STAT TIME COMMAND
5940 p3 S 0:00 a.out
5941 p3 Z 0:00 <defunct> the zombie
5942 p3 S 0:00 sh -c ps
5943 p3 R 0:00 ps
µÚ¾ÅÕÂ
9.1 ÒòΪinitÊÇlogin shellµÄ¸¸½ø³Ì£¬µ±login shellÖÕֹʱËüÊÕµ½SIGCHLDÐźÅ
Á¿£¬ËùÒÔinit½ø³ÌÖªµÀʲôʱºòÖÕ¶ËÓû§×¢Ïú¡£
ÍøÂçloginûÓаüº¬init£¬ÏàÓ¦µÄlogoutÏîÊÇÓÉÒ»¸ö´¦Àílogin²¢¼à²âlogoutµÄ½ø
³ÌдµÄ¡£(±¾ÀýÖÐΪtelnetd)
µÚÊ®ÕÂ
10.1 µ±³ÌÐòµÚÒ»´Î½Óµ½ÎÒÃÇ·¢Ë͸øËüµÄÐźÅÁ¿¾ÍÖÕÖ¹ÁË¡£ÒòΪһ²¶×½µ½ÐźÅÁ¿pa
useº¯Êý¾Í·µ»Ø¡£
10.2 ³ÌÐòC.8ʵÏÖÁËraiseº¯Êý¡£
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
int
raise(int signo)
{
return( kill(getpid(), signo) );
}
³ÌÐòC.8 raiseº¯ÊýµÄʵÏÖ
10.3 ¼ûͼC.3¡£
ͼC.3 longjumpǰºóµÄ¶Ñջ״̬
´Ósig_alrmͨ¹ýlongjmp·µ»Ømain£¬ÓÐЧµØ±ÜÃâÁ˼ÌÐøÖ´ÐÐsig_int¡£
10.4 Èç¹û½ø³ÌÔÚµ÷ÓÃalarmºÍsetjmpÖ®¼ä±»ÄÚºË×èÈûÁË£¬alarmʱ¼ä×ßÍêÖ®ºó¾Íµ÷
ÓÃÐźÅÁ¿´¦Àí³ÌÐò£¬È»ºóµ÷ÓÃlongjmp¡£µ«ÊÇÓÉÓÚûÓе÷ÓÃsetjmp£¬ËùÒÔûÓÐÉèÖÃ
env_alrm»º´æÇø¡£Èç¹ûlongjmpµÄÌø×ª»º´æÇøÃ»Óб»setjmp³õʼ»¯£¬Ôò˵Ã÷ûÓж¨
ÒålongjmpµÄ²Ù×÷¡£
10.5 ²Î¼û" Implementing Software Timers " by Don Libers ( C user Journa
l, Vol. 8, no. 11, Nov. 1990 )ÖеÄÀý×Ó¡£
10.7 Èç¹û½ö½öµ÷ÓÃ_exit£¬Ôò½ø³ÌÖÕֹ״̬¾Í²»Äܱíʾ¸Ã½ø³ÌÊÇÓÉÓÚSIGABRTÐźÅ
Á¿¶øÖÕÖ¹µÄ¡£
10.8 Èç¹ûÐźÅÁ¿ÊÇÓÉÆäËüÓû§µÄ½ø³Ì·¢³öµÄ£¬½ø³Ì±ØÐëÉèÖÃÓû§µÄIDΪ¸ù»òÕßÊÇ
½ÓÊÕ½ø³ÌµÄÓµÓÐÕߣ¬·ñÔòkill²»ÄÜÖ´ÐС£ËùÒÔʵ¼ÊµÄÓû§IDΪÐźÅÁ¿µÄ½ÓÊÕÕßÌṩ
Á˸ü¶àµÄÐÅÏ¢¡£
10.10 ¶ÔÓÚ±¾ÊéÖÐËùÓõÄϵͳ£¬´óԼÿ60-90·ÖÖÓÔö¼ÓÒ»Ã룬Õâ¸öÎó²îÊÇÒòΪÿ´Î
µ÷ÓÃsleep¶¼Òªµ÷¶ÈÒ»½«À´µÄʱ¼äʼþ£¬µ«ÊÇÓÉÓÚCPUµ÷¶È£¬ÓÐʱÎÒÃDz¢Ã»ÓÐÔÚʼþ
·¢Éúʱ±»½ÐÐÑ¡£ÁíÍâÒ»¸öÔÒòÊÇ¿ªÊ¼ÔËÐнø³ÌºÍµ÷ÓÃsleep¶¼ÐèÒªÒ»¶¨µÄʱ¼ä¡£
BSDÖеÄcronÿ·ÖÖÓ¶¼ÒªÈ¡µ±Ç°Ê±¼ä£¬ËüÊ×ÏÈÉèÖÃÒ»¸öÐÝÃßÖÜÆÚ£¬È»ºóÔÚÏÂÒ»·ÖÖÓ
¿ªÊ¼Ê±»½ÐÑ¡£´ó¶àÊýµ÷ÓÃÊÇsleep(60)£¬Å¼¶ûÓÐÒ»¸ösleep(59)ÓÃÓÚÔÚÏÂÒ»·ÖÖÓͬ²½
¡£µ«ÊÇÈôÔÚ½ø³ÌÖл¨·ÑÁËÐí¶àʱ¼äÖ´ÐÐÃüÁî»òÕßϵͳµÄ¸ºÔØÖص÷¶ÈÂý£¬ÕâʱÐÝÃßÖµ
¿ÉÄÜԶСÓÚ60¡£
10.11 ÔÚSVR4ÖУ¬´ÓÀ´Ã»Óе÷ÓùýSIGXFSZµÄÐźÅÁ¿´¦Àí³ÌÐò£¬Ò»µ©ÎļþµÄ´óС´ï
µ½1024ʱ£¬write¾Í·µ»Ø24¡£
ÔÚ4.3+BSDÖУ¬Îļþ´óС´ïµ½1500×Ö½Úʱµ÷ÓøÃÐźŴ¦Àí³ÌÐò£¬write·µ»Ø-1²¢ÇÒ
errnoÉèÖÃΪEFBIG¡£
SunOS4.1.2µÄÇé¿öÓëSVR4ÀàËÆ£¬µ«Êǵ÷ÓÃÁ˸ÃÐźÅÁ¿´¦Àí³ÌÐò¡£
System VÔÚÎļþ´óС´ïµ½Èí×ÊÔ´ÏÞÖÆÊ±ÎÞ´í·µ»ØÒ»¸ö½ÏСµÄÊý£¬¶øBSDÅжÏÎļþ³¬
³öÏÞÖÆÊ±´íÎ󷵻أ¬Ã»ÓÐдÈκÎÊý¾Ý¡£
10.12 ½á¹ûÒÀÀµÓÚ±ê×¼I/O¿âµÄʵÏÖ--fwriteÈçºÎ´¦ÀíÒ»¸ö±»ÖжϵÄд¡£
µÚʮһÕÂ
11.1 ×¢ÒâÓÉÓÚÖÕ¶ËÊÇ·ÇÕý¹æÄ£Ê½£¬ËùÒÔÒªÓû»Ðзû¶ø²»ÊǻسµÖÕÖ¹resetÃüÁî¡£
11.2 ËüΪ128¸ö×Ö·û½¨ÁËÒ»ÕÅ±í£¬¸ù¾ÝÓû§µÄÒªÇóÉèÖÃÆæÅ¼Ð£Ñéλ¡£È»ºóʹÓÃ8λ
I/O´¦ÀíÆæÅ¼Î»µÄ²úÉú¡£
11.3 ÔÚSVR4ÖÐÔËÐÐstty -a£¬²¢ÇÒ½«±ê×¼ÊäÈëÖØ¶¨Ïòµ½ÔËÐÐviµÄÖÕ¶Ë£¬½á¹ûÏÔʾv
iÉèÖÃMINΪ1¡¢TIMEΪ1¡£readsµÈ´ýÖÁÉÙÇÃÈëÒ»¸ö×Ö·û£¬µ«ÊǸÃ×Ö·ûÊäÈëºó£¬Ö»¶Ô
ºó¼ÌµÄ×Ö·ûµÈ´ýÊ®·ÖÖ®Ò»Ãë¼´·µ»Ø¡£
11.4 ÔÚSVR4ÖÐʹÓÃÀ©Õ¹µÄͨÓÃÖն˽ӿڡ£²Î¼ûAT&T[1991]ÊÖ²áÖеÄtemiox(7)¡£ÔÚ
4.3+BSDÖÐʹÓÃc_cflag×ֶεÄCCTS_OFLOWºÍCRTS_IFLOW±êÖ¾£¬²Î¼ûͼ11.3¡£
µÚÊ®¶þÕÂ
12.1 ³ÌÐòÔËÐÐÕý³££¬²»»á·¢ÉúENOLCKµÄ´íÎó¡£µÚÒ»´ÎÑ»·µ÷ÓÃwritew_lock¡¢wri
teºÍun_lock¡£µ÷ÓÃun_lockºóÖ»±£ÁôÁ˵ÚÒ»¸ö×Ö½ÚµÄËø£¬µÚ¶þ´ÎÑ»·Ê±£¬µ÷ÓÃwri
tew_lockʹµÃÐÂËøÓëµÚÒ»¸ö×Ö½ÚµÄËøºÏ²¢£¬Í¼C.4Êǵڶþ´ÎÑ»·µÄ½á¹û¡£
ͼC.4 µÚ¶þ´ÎÑ»·ºóËøµÄ״̬
ÿѻ·Ò»´Î¾ÍÀ©Õ¹Ò»¸ö×Ö½ÚµÄËø£¬Äں˽«ÕâÐ©ËøºÏ²¢ºó¾ÍÖ»±£³ÖÁËÒ»¸öËø£¬Òò´Ë
·ûºÏËø½á¹¹µÄ¶¨Òå¡£
12.2 ÔÚSVR4¡¢4.3+BSDÖÐ,fd_setÊÇÖ»°üº¬Ò»¸ö³ÉÔ±µÄ½á¹¹£¬¸Ã³ÉԱΪһ¸ö³¤ÕûÐÍ
Êý×é¡£Êý×éÖÐÿһλ¶ÔÓ¦ÓÚÒ»¸öÃèÊö·û¡£ËĸöFD_ºêͨ¹ý¿ª¹Ø»ò²âÊÔÖ¸¶¨µÄλÀ´²Ù
×ÝÕâ¸öÊý×é¡£½«Ö®¶¨ÒåΪһ¸ö°üº¬Êý×éµÄ½á¹¹¶ø²»½ö½öÊÇÒ»¸öÊý×éµÄÔÒòÊÇ£ºÍ¨¹ý
CÓïÑԵĸ³ÖµÓï¾ä£¬¿ÉÒÔʹfd_setÀàÐͱäÁ¿Ï໥¸³Öµ¡£
12.3 ÔÚSVR4¡¢4.3+BSDÖÐÔÊÐíÓû§°üº¬Í·Îļþ<sys/types.h> ǰ¶¨Òå³£ÊýFD_SETS
IZE¡£ÀýÈçÏÂÃæµÄ´úÂë¿ÉÒÔʹfd_setÊý¾ÝÀàÐͰüº¬2048¸öÃèÊö·û¡£
#define FD_SETSIZE 2048
#include <sys/types.h>
12.4 ÏÂÃæµÄ±íÁгöÁ˹¦ÄÜÀàËÆµÄº¯Êý¡£
FD_ZERO sigemptyset
FD_SET sigaddset
FD_CLR sigdelset
FD_ISSET sigismember
ûÓÐÓësigfillset¶ÔÓ¦µÄFD_XXXº¯Êý¡£¶ÔÐźÅÁ¿À´Ëµ£¬Ö¸ÏòÐźÅÁ¿¼¯ºÏµÄÖ¸ÕëÊÇ
µÚÒ»¸ö²ÎÊý£¬ÐźÅÁ¿ÊýÊǵڶþ¸ö²ÎÊý£»¶ÔÓÚÃèÊö·ûÀ´Ëµ£¬ÃèÊö·ûÊýÊǵÚÒ»¸ö²ÎÊý£¬
Ö¸ÏòÃèÊö·û¼¯ºÏµÄÖ¸ÕëÊǵڶþ¸ö²ÎÊý¡£
12.5 ×î¶àÎåÖÖÐÅÏ¢£ºÊý¾Ý£¬Êý¾Ý³¤¶È£¬¿ØÖÆÐÅÏ¢£¬¿ØÖÆÐÅÏ¢µÄ³¤¶ÈºÍ±êÖ¾¡£
12.6 ÀûÓÃselectʵÏֵijÌÐò¼ûC.9£¬ÀûÓÃpollʵÏֵijÌÐò¼ûC.10¡£
#include <sys/types.h>
#include <sys/time.h>
#include <stddef.h>
#include "ourhdr.h"
void
sleep_us(unsigned int nusecs)
{
struct timeval tval;
tval.tv_sec = nusecs / 1000000;
tval.tv_usec = nusecs % 1000000;
select(0, NULL, NULL, NULL, &tval);
}
³ÌÐòC.9 ÓÃselectʵÏÖsleep_usº¯Êý
#include <sys/types.h>
#include <poll.h>
#include <stropts.h>
#include "ourhdr.h"
void
sleep_us(unsigned int nusecs)
{
struct pollfd dummy;
int timeout;
if ( (timeout = nusecs / 1000) <= 0)
timeout = 1;
poll(&dummy, 0, timeout);
}
³ÌÐòC.10 ÓÃpollʵÏÖsleep_usº¯Êý
BSDÖеÄusleep(3)ʹÓÃsetitimerÉèÖüä¸ô¼ÆÊ±Æ÷£¬²¢ÇÒÖ´ÐÐ8¸öϵͳµ÷Óá£Ëü¿É
ÒÔÕýÈ·µÄºÍµ÷Óýø³ÌÉèÖÃµÄÆäËü¼ÆÊ±Æ÷½»»¥×÷Ó㬶øÇÒ¼´Ê¹²¶×½µ½ÐźÅÁ¿Ò²²»»á±»
Öжϡ£
12.7 ²»ÐС£ÎÒÃÇ¿ÉÒÔʹTELL_WAIT´´½¨Ò»¸öÁÙʱÎļþ£¬ÆäÖÐÒ»¸ö×Ö½ÚÓÃ×÷Ϊ¸¸½ø³Ì
µÄËø£¬ÁíÒ»¸ö×Ö½ÚÓÃ×÷Ϊ×Ó½ø³ÌµÄËø¡£WAIT-CHILDʹµÃ¸¸½ø³ÌµÈ´ý×Ó½ø³ÌµÄËø£¬T
ELL_PARENTʹµÃ×Ó½ø³ÌÊÍ·Å×Ó½ø³ÌµÄËø¡£µ«ÊÇÎÊÌâÔÚÓÚµ÷ÓÃforkºó£¬×Ó½ø³ÌÊÍ·ÅÁË
ËùÓеÄËøµ¼ÖÂ×Ó½ø³Ì²»ÄܾßÓÐÈκÎËü×Ô¼ºµÄËø¶ø¿ªÊ¼Ö´ÐС£
12.8 ÓÃselectµÄ·½·¨¼û³ÌÐòC.11£¬Ê¹ÓÃpollµÄÇé¿öÀàËÆ¡£
#include <sys/types.h>
#include <sys/time.h>
#include "ourhdr.h"
int
main(void)
{
int i, n, fd[2];
fd_set writeset;
struct timeval tv;
if (pipe(fd) < 0)
err_sys("pipe error");
FD_ZERO(&writeset);
for (n = 0; ; n++) { /* write 1 byte at a time until pipe is full */
FD_SET(fd[1], &writeset);
tv.tv_sec = tv.tv_usec = 0; /* don't wait at all */
if ( (i = select(fd[1]+1, NULL, &writeset, NULL, &tv)) < 0)
err_sys("select error");
else if (i == 0)
break;
if (write(fd[1], "a", 1) != 1)
err_sys("write error");
}
printf("pipe capacity = %d\n", n);
exit(0);
}
³ÌÐòC.11 ÓÃselect¼ÆËã¹ÜµÀµÄÐÔÄÜ
ÔÚSVR4ºÍSunOS 4.1.1ÖÐʹÓÃselectºÍpoll¼ÆËã³öµÄ½á¹ûµÈÓÚͼ2.6µÄÖµ¡£ÔÚ4.3B
SDÖÐʹÓÃselect¼ÆËãµÄ½á¹ûΪ3073¡£
12.9 ÔÚSVR4¡¢4.3+BSDºÍSunOS 4.1.2ÖУ¬³ÌÐò12.14ȷʵÐÞ¸ÄÁËÊäÈëÎļþµÄ×î½üÒ»
´Î·ÃÎÊʱ¼ä¡£
µÚÊ®ÈýÕÂ
13.1 Èç¹û½ø³Ìµ÷ÓÃchroot¾Í²»ÄÜ´ò¿ª/dev/log£¬½â¾öµÄ°ì·¨ÊÇÔÚchroot֮ǰµ÷ÓÃ
Ñ¡ÏîΪLOG_NDELAYµÄopenlog¡£ÕâÑù¼´Ê¹µ÷ÓÃÁËchrootÖ®ºó£¬ÈÔÈ»¿ÉÒÔ´ò¿ªÌض¨µÄ
É豸Îļþ£¨UNIXÓëÊý¾Ý°üÌ×½Ó¿Ú£©²¢Éú³ÉÒ»¸öÓÐЧµÄÃèÊö·û¡£
13.3 ³ÌÐòC.12ÊÇÒ»ÖÖ½â¾ö·½°¸¡£
#include "ourhdr.h"
int
main(void)
{
char *ptr, buff[MAXLINE];
daemon_init();
close(0);
close(1);
close(2);
ptr = getlogin();
sprintf(buff, "login name: %s\n",
(ptr == NULL) ? "(empty)" : ptr);
write(3, buff, strlen(buff));
exit(0);
}
³ÌÐòC.12 µ÷ÓÃdaemon_init»ñµÃ×¢²áÃû
½á¹ûÒÀÀµÓÚ²»Í¬µÄϵͳʵÏÖºÍÊÇ·ñ¹Ø±ÕÎļþÃèÊö·û1¡¢2ºÍ3¡£¹Ø±ÕÃèÊö·ûÓ°Ïì½á¹û
µÄÔÒòÊÇ£ºµ±³ÌÐò¿ªÊ¼Ö´ÐÐʱÓë¿ØÖÆÖÕ¶ËÁ¬½Ó£¬µ÷ÓÃdeamon_initºó¹Ø±Õ3¸öÃèÊö·û
¾ÍÒâζ×ÅgetloginûÓпØÖÆÖÕ¶Ë£¬ËùÒÔ²»ÄÜÔÚutmpÎļþÖп´µ½µÇ¼Ïî¡£
µ«ÊÇÔÚ4.3+BSDÖУ¬µÇ¼ÃûÊÇÓɽø³Ì±íά»¤µÄ£¬²¢ÇÒ¿ÉÒÔͨ¹ýfork¸´ÖÆ¡£Ò²¾ÍÊÇ˵
³ý·ÇÆä¸¸½ø³ÌûÓеǼÃû(Èçϵͳ×ÔÒýµ¼Ê±µ÷ÓÃinit)£¬·ñÔò½ø³Ì×ÜÄÜ»ñµÃÆäµÇ¼Ãû
¡£
µÚÊ®ËÄÕÂ
14.1 Èç¹ûд¹ÜµÀ¶Ë×ÜÊDz»¹Ø±Õ£¬Ôò¶ÁÕ߾;ö²»»á¿´µ½ÎļþµÄ½áÊø·û¡£Ò³Ãæµ÷¶È³Ì
Ðò¾Í»áÒ»Ö±×èÈûÔÚ¶Á±ê×¼ÊäÈë¡£
14.2 ¸¸½ø³ÌÏò¹ÜµÀдÍê×îºóÒ»ÐÐÒÔºó¾ÍÖÕÖ¹ÁË£¬È»ºó¶ÁÕß¶Áµ½¹ÜµÀµÄ½áβʱ×Ô¶¯
¹Ø±Õ¹ÜµÀ¡£µ«ÊÇÓÉÓÚ×Ó½ø³Ì(Ò³Ãæµ÷¶È³ÌÐò)ÒªµÈ´ýÊä³öµÄÒ³£¬ËùÒÔ¸¸½ø³Ì¿ÉÄܱÈ×Ó
err_sys ( "setvbuf error" ) ;
whileÖеÄreadºÍwriteÓÃÏÂÃæµÄÓï¾ä´úÌæ¡£
if (fputs ( line, fpout ) == EOF )
err_sys ( "fputs error to pipe" ) ;
if ( fgets ( line, MAXLINE, FPIN ) == NULL ) {
err_msg ( "child close pipe" ) ;
break ;
}
14.6 ËäÈ»systemº¯Êýµ÷ÓÃÁËwait£¬µ«ÊÇÖÕÖ¹µÄµÚÒ»¸ö×Ó½ø³ÌÊÇÓÉpopen²úÉúµÄ£¬Ëù
ÒÔËü½«Ôٴε÷ÓÃwait²¢Ò»Ö±×èÈûµ½sleepÍê³É£¬È»ºósystem·µ»Ø¡£µ±pcloseµ÷ÓÃwa
itʱ£¬ÓÉÓÚûÓÐ×Ó½ø³Ì¿ÉµÈ´ýËùÒÔ·µ»Ø³ö´í£¬µ¼ÖÂpcloseÒ²·µ»Ø³ö´í¡£
14.7 select±íÃ÷ÃèÊö·ûÊǿɶÁµÄ¡£µ÷ÓÃread¶ÁÍêËùÓеÄÊý¾Ýºó·µ»Ø0¾Í±íÃ÷µ½ÁËÎÄ
¼þβ¡£¶ÔÓÚpoll(¼ÙÉè¹ÜµÀÊÇÒ»¸öÁ÷É豸)À´Ëµ£¬Èô·µ»ØPOLLHUPÒ²ÐíÈÔÓÐÊý¾Ý¿ÉÒÔ
¶Á¡£µ«ÊÇÒ»µ©¶ÁÍêÁËËùÓеÄÊý¾Ýread¾Í·µ»Ø0£¬¼´±íÃ÷µ½ÁËÎļþβ¡£poll¶ÁÍêÁËËù
ÓеÄÊý¾Ýºó²¢²»·µ»ØPOLLIN¡£
¶ÔÓÚ±»¶ÁÕ߹رյÄÖ¸Ïò¹ÜµÀµÄÊä³öÃèÊö·ûÀ´Ëµ£¬select±íÃ÷ÃèÊö·ûÊÇ¿ÉдµÄ£¬µ÷
ÓÃwriteʱ²úÉúSIGPIPEÐźÅÁ¿£¬Èç¹ûÎÒÃǺöÂÔ¸ÃÐźÅÁ¿»ò´ÓÐźÅÁ¿´¦Àí³ÌÐòÖзµ»Ø
ʱwrite¾Í·µ»ØEPIPE´íÎó¡£¶ø¶ÔÓÚpoll£¬Èç¹û¹ÜµÀÊÇÒ»¸öÁ÷É豸£¬poll¾Í¶Ô¸ÃÃèÊö
·û·µ»ØPOLLHUP¡£
14.8 ×Ó½ø³ÌÏò±ê×¼³ö´íдµÄÄÚÈÝͬÑùÒ²ÔÚ¸¸½ø³ÌµÄ±ê×¼³ö´íÖгö´í¡£Ö»ÒªÔÚcmds
tring°üº¬Öض¨Ïò2 > &1ÃüÁ¾Í¿ÉÒÔ½«±ê×¼³ö´í·¢Ë͸ø¸¸½ø³Ì¡£
14.9 popenÉú³ÉÒ»¸ö×Ó½ø³Ì£¬×Ó½ø³Ìͨ¹ýexecÖ´ÐÐBourne shell¡£È»ºóShellÔÙµ÷
ÓÃfork£¬×îºóÓÉshellµÄ×Ó½ø³ÌÖ´ÐÐÃüÁî´®¡£µ±cmdstringÖÕֹʱshellÇ¡ºÃÔڵȴý
¸Ãʼþ£¬È»ºóshellÍ˳ö£¬¶øÕâһʼþÓÖÊÇpcloseÖÐwaitpidËùµÈ´ýµÄ¡£
14.10 ½â¾öµÄ°ì·¨ÊÇ´ò¿ªFIFOÁ½´Î£¬Ò»´Î¶ÁÒ»´Îд¡£Ò»°ãÎÒÃDz»»á¶Ô´ò¿ªµÄÃèÊö·û
½øÐÐд£¬ÎÒÃǾø²»»áʹÓÃΪд¶ø´ò¿ªµÄÃèÊö·û£¬µ«ÊÇʹ¸ÃÃèÊö·û´ò¿ª¾Í¿ÉÔÚ¿Í»§Êý
´Ó1±äΪ0ʱ£¬×èÖ¹²úÉúÎļþÖÕÖ¹¡£´ò¿ªFIFOÁ½´ÎÐèҪעÒâÏÂÁвÙ×÷·½Ê½£ºµÚÒ»´ÎÒÔ
·Ç×èÈû¡¢Ö»¶Á·½Ê½open£¬µÚ¶þ´ÎÒÔ×èÈû¡¢Ö»Ð´·½Ê½open¡£(Èç¹ûÓ÷Ç×èÈû¡¢Ö»Ð´·½
ʽ´ò¿ª½«·µ»Ø´íÎó¡£)È»ºó¹Ø±Õ¶ÁÃèÊö·ûµÄ·Ç×èÈûÊôÐÔ¡£²Î¼û³ÌÐòC.13¡£
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "ourhdr.h"
#define FIFO "temp.fifo"
int
main(void)
{
int fdread, fdwrite;
unlink(FIFO);
if (mkfifo(FIFO, FILE_MODE) < 0)
err_sys("mkfifo error");
if ( (fdread = open(FIFO, O_RDONLY | O_NONBLOCK)) < 0)
err_sys("open error for reading");
if ( (fdwrite = open(FIFO, O_WRONLY)) < 0)
err_sys("open error for writing");
clr_fl(fdread, O_NONBLOCK);
exit(0);
}
³ÌÐòC.13 ÒÔ·Ç×èÈû·½Ê½´ò¿ªFIFO½øÐжÁд²Ù×÷
14.11 ËæÒâ¶ÁÈ¡ÏÖÐеĶÓÁÐÖеÄÏûÏ¢»á¸ÉÈſͻ§/·þÎñÆ÷ÐÒ飬µ¼Ö¶ªÊ§¿Í»§µÄÇë
Çó»òÕß·þÎñÆ÷µÄÏìÓ¦¡£ÓÉÓÚ¶ÓÁÐÔÊÐíËùÓеÄÓû§¶Á£¬ËùÒÔ½ø³ÌÖ»ÒªÖªµÀ¶ÓÁеıêʶ
·û¾Í¿ÉÒÔ¶Á¶ÓÁС£
14.13 ÓÉÓÚ·þÎñÆ÷ºÍ¿Í»§¶¼¿ÉÄܽ«¶ÎÁ¬½Óµ½²»Í¬µÄµØÖ·£¬ËùÒÔÔÚ¹²ÏíµÄÄÚ´æ¶ÎÖв»
´æ·Åʵ¼ÊÎïÀíµØÖ·¡£Ïà·´£¬µ±ÔÚ¹²ÏíµÄÄÚ´æ¶ÎÖн¨Á¢Á´±íʱ£¬Ö¸ÕëµÄÖµÉèÖÃΪ¹²Ïí
ÄÚ´æ¶ÎÄ򵀮«ÒÆ¡£Æ«ÒÆÁ¿ÎªËùָĿ±êµÄʵ¼ÊµØÖ·¼õÈ¥¹²ÏíÄÚ´æ¶ÎµÄÆðʼµØÖ·¡£
£
14.14 ͼC.5ÏÔʾÁËÏà¹ØµÄʼþ¡£
µÚÊ®ÎåÕÂ
15.3 ˵Ã÷Ö¸¶¨Á˱êʶ·û¼¯ºÏµÄÊôÐÔ£¨ÀýÈçÊý¾ÝÀàÐÍ£©£¬Èç¹û˵Ã÷µÄͬʱ·ÖÅäÁË´æ
´¢µ¥Ôª¾ÍÊǶ¨Òå¡£
ÔÚÍ·Îļþ<open.h>ÖÐÓÃextern˵Ã÷ÁËÈý¸öÈ«¾Ö±äÁ¿£¬Õâʱ²¢Ã»ÓÐΪËüÃÇ·ÖÅä´æ´¢
µ¥Ôª£¬ÔÚÎļþ<main.c>Öж¨ÒåÁËÈý¸öÈ«¾Ö±äÁ¿£¬ÓÐʱ»áÔÚ¶¨Òåʱ¾Í³õʼ»¯È«¾Ö±äÁ¿
£¬µ«Í¨³£Ê¹ÓÃCµÄȱʡֵ¡£
15.5 selectºÍpoll¶¼·µ»Ø¾ÍÐ÷µÄÃèÊö·û¸öÊý¡£µ±½«ÕâЩ¾ÍÐ÷ÃèÊö·û¶¼´¦ÀíÍêºó£¬
²Ù×÷clientÊý×éµÄÑ»·¾Í¿ÉÒÔ½áÊø¡£
µÚÊ®ÁùÕÂ
16.1 _db_dodeleteÖб£ÊصÄÉÏËø²Ù×÷ÊÇΪÁ˱ÜÃâºÍdb_nextrec·¢Éú¾ºÌ¬Ìõ¼þ¡£Èç
¹ûûÓÐʹÓÃÐ´Ëø±£»¤_db_writedatµ÷Óã¬ÔòÓпÉÄÜÔÚ_db_nextrec¶Áij¸ö¼Ç¼ʱ²Á
È¥¸Ã¼Ç¼£ºdb_nextrecÊ×ÏȶÁÈëÒ»¸öË÷Òý¼Ç¼£¬·¢ÏָüǼ·Ç¿Õ£¬Ôò½Ó×ŶÁÈë¼Ç¼
ÄÚÈÝ£¬µ«ÊÇÔÚËüµ÷ÓÃ_db_readidxºó_db_readdatǰ£¬¸Ã¼Ç¼ȴ¸ø_db_dodeleteɾ³ý
ÁË¡£
16.2 ¼Ù¶¨db_nextrecµ÷ÓÃÁË_db_readidx£¬Ëü½«¼Ç¼µÄ¹Ø¼ü×Ö¶ÁÈëË÷Òý»º´æ½øÐд¦
Àí¡£µ«¸Ã´¦Àí¹ý³Ì±»Äں˵÷¶È½ø³Ì´ò¶Ï£¬ÁíÒ»¸öÖ´ÐеĽø³Ì¸ÕºÃµ÷ÓÃdb_deleteɾ
³ýÁËÕâÒ»Ìõ¼Ç¼£¬Ê¹µÃË÷ÒýÎļþºÍ¼Ç¼ÎļþÖжÔÓ¦µÄÄÚÈݶ¼±»Çå¿Õ¡£µ±µÚÒ»¸ö½ø³Ì
»Ö¸´Ö´Ðв¢µ÷ÓÃ_db_readdat(ÔÚdb_nextrecº¯ÊýÌåÖÐ)ʱ£¬·µ»ØµÄÊǿռǼ¡£ËùÒÔ
db_nextrecÖеĶÁËøÊ¹µÃ¶ÁÈë¼Ç¼Ë÷ÒýµÄ¹ý³ÌºÍ¶ÁÈë¼Ç¼ÄÚÈݵĹý³ÌÊÇÒ»¸öÔ×Ó²Ù
×÷(ÖÁÉÙ¶ÔÆäËü²Ù×÷ͬһÊý¾Ý¿âµÄ²¢·¢½ø³ÌÖеÄд²Ù×÷¶øÑÔ)¡£
16.3 Ç¿ÖÆµÄËø¶¨¶ÔÆäËüµÄ¶ÁÕߺÍдÕß²úÉúÁËÓ°Ïì--ÆäËüµÄ¶ÁºÍд²Ù×÷¶¼±»×èÈû£¬
Ö±µ½_db_writeidxºÍ_db_writedatÉèÖõÄËø±»½â³ý¡£
µÚÊ®ÆßÕÂ
17.1 psif±ØÐë¶ÁÈ¡ÎļþµÄǰÁ½¸ö×Ö½Ú²¢ÇÒÓë%!½øÐбȽϡ£Èç¹ûÎļþÊÇ¿ÉÒÔËæ»ú¶¨
λµÄ£¬Ôò¿ÉÒÔrewindÎļþ£¬²¢µ÷ÓÃlprps»òtextps¡£Èç¹ûÎļþ²»¿ÉËæ»ú¶¨Î»£¬ÔòÖ»
Äܽ«¸ÃÁ½¸ö×Ö½ÚÖØÐ·Żرê×¼ÊäÈëÉ豸¡£´Ëʱһ¸ö¿ÉÐеİ취ÊÇ£º½¨Á¢Ò»¸ö¹ÜµÀ²¢
forkÒ»¸ö×Ó½ø³Ì¡£È»ºó¸¸½ø³Ì½«Æä±ê×¼ÊäÈëÉ豸ÉèÖÃΪ¹ÜµÀ£¬²¢Ö´ÐÐtextps»òlpr
ps¡£È»ºó×Ó½ø³Ì½«Ëü¶Áµ½µÄÁ½¸ö×Ö½ÚдÈë¹ÜµÀ£¬ÔÙ½Ó׎«ÎļþµÄÆäËü²¿·ÖÊä³ö¡£
µÚÊ®°ËÕÂ
18.2 ͨ³£getoptÖ»ÓÃÀ´´¦Àíµ¥¸ö²ÎÊýÁÐ±í¡£ÔÚgetoptº¯ÊýµÄ³õʼ»¯Êý¾Ý¶Î£¬È«¾Ö
±äÁ¿optind±»³õʼ»¯Îª1¡£µ«ÊÇÔÚÎÒÃǵķþÎñÆ÷ÖУ¬ÎÒÃǵ÷ÓÃgetoptÀ´´¦Àí¶à¸ö²Î
ÊýÁбí--ÿ¸öclientÒ»¸ö£¬ËùÒÔÎÒÃDZØÐëÔÚΪÿ¸öclientÊ״ε÷ÓÃgetoptǰ¾ùÖØÐÂ
³õʼ»¯optind¡£
18.3 ÎÒÃÇʹÓÃÁËClient½á¹¹Î¬»¤ÏµÍ³ÎļþµÄÆ«ÒÆÖµ¡£Èç¹ûÔÚ±£´æÁËÆ«ÒÆÖµºó¡¢ÔÙ
´ÎʹÓÃ֮ǰÐÞ¸ÄÁ˸ÃÎļþ£¬ÔòÓпÉÄÜÉϴα£´æµÄÆ«ÒÆÖµ²»ÔÙÖ¸ÏòËûÒÔǰָÏòµÄÐС£
ËäÈ»·þÎñÆ÷¿ÉÒÔ¼ì²âµ½ÎļþÊÇ·ñ±»ÐÞ¸ÄÁË(ÈçºÎ¼ì²â£¿)£¬µ«ÊÇÎÒÃÇÎÞ·¨ÔÙ½«Æ«ÒÆÖµ
»Ö¸´µ½ÔÀ´µÄÕýȷλÖᣵ±ÎļþÐ޸ĺó,ÎÒÃÇΨһµÄ°ì·¨ÊDz»ÈÃÓйØÓû§ÔڵǼ½ø
À´¡£
18.4 Ö»Óе±client_add±»µ÷ÓÃʱ£¬ÎÒÃDzÅÄÜͨ¹ýreallocÒÆ¶¯clientÊý×é¡£ÒòΪc
lient_addÊÇÔÚselectºó£¬¶ø²»ÊÇÔÚʹÓÃcliptrµÄÑ»·ÖС£
18.5 ·¢Ë͵½Ô¶¶ËϵͳµÄ²»Í¬ÃüÁî¿ÉÄܻᱻ»ìÏýÆðÀ´¡£¿ÉÒÔÔÚtake_put_argsÖмÓÈë
һЩ¼ì²é¹¦ÄÜʵÏÖÃüÁîµÄÇø·Ö¡£
18.6 Ò»¸ö³£Óõķ½·¨ÊÇ£ºÒªÇóÓû§ÔÚÐÞ¸ÄÈκÎÎļþºó֪ͨ·þÎñÆ÷£¬ÒÔʹ·þÎñÆ÷¿É
ÒÔÖØÐ¶ÁÈ¡Îļþ¡£SIGHUPÃüÁî¾ÍÊǾ³£ÓÃÀ´Íê³ÉÕâÏîÈÎÎñµÄ¡£
18.9 ¿ÉÒÔÔÚÔ¶¶ËÖ´ÐÐsttyÃüÁȻºó·ÖÎöÆäÊä³ö½á¹û¡£µ«ÊÇ¿¼Âǵ½²»Í¬UNIXƽ̨
µÄsttyÃüÁîÊä³ö½á¹û²î±ðºÜ´ó£¬ÕâÖÖ·½Ê½ÊµÏÖÆðÀ´½ÏΪÀ§ÄÑ¡£
µÚÊ®¾ÅÕÂ
19.1 telnetdºÍrlogindÁ½¸ö·þÎñÆ÷¾ùÒÔ³¬¼¶Óû§µÄȨÏÞÔËÐÐ,ËùÒÔËüÃǶ¼¿ÉÒԳɹ¦
µØµ÷ÓÃchownºÍchmod¡£
Ì
--
--
¡ù À´Ô´:¡¤BBS ˮľÇ廪վ smth.org¡¤[FROM: 202.38.248.38]
BBSˮľÇ廪վ¡Ã¾«»ªÇø