Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 53

Автор ΠΡ€Π½ΠΎΠ»ΡŒΠ΄ Роббинс

18  } ln;

19  char ltype;

20  short lnum;

21  short lflags;

22  short lnl;

23  short luid;

24  short lgid;

25  long lsize;

26  long lmtime;

27 };

28

29 int aflg, dflg, lflg, sflg, tflg, uflg, lflg, fflg, gflg, cflg;

30 int rflg = 1;

31 long year; /* Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅: ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ 0 */

32 int flags;

33 int lastuid = -1;

34 char tbuf[16];

35 long tblocks;

36 int statreq;

37 struct lbuf *flist[NFILES];

38 struct lbuf **lastp = flist;

39 struct lbuf **firstp = flist;

40 char *dotp = ".";

41

42 char *makename(); /* char *makename(char *dir, char *file); */

43 struct lbuf *gstat(); /* struct lbuf *gstat(char *file, int argfl); */

44 char *ctime(); /* char *ctime(time_t *t); */

45 long nblock(); /* long nblock(long size); */

46

47 #define ISARG 0100000

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° начинаСтся с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ„Π°ΠΉΠ»ΠΎΠ² (строки 5–8) ΠΈ объявлСний ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. struct lbuf (строки 14–27) инкапсулируСт части struct stat, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ интСрСсны ls. ПозТС ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ эта структура заполняСтся.

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ aflg, dflg ΠΈ Ρ‚.Π΄. (строки 29 ΠΈ 30) всС ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠΏΡ†ΠΈΠΈ. Π’Π°ΠΊΠΎΠΉ ΡΡ‚ΠΈΠ»ΡŒ имСнования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΈΡ‡Π΅Π½ для ΠΊΠΎΠ΄Π° V7. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ flist, lastp ΠΈ firstp (строки 37–39) ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ„Π°ΠΉΠ»Ρ‹, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ls Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ свСдСния. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ flist являСтся массивом фиксированного Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, которая позволяСт ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 1024 Ρ„Π°ΠΉΠ»ΠΎΠ². ВскорС ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ всС эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

ПослС объявлСний ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈΠ΄ΡƒΡ‚ объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (строки 42–45), Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ISARG, которая Ρ€Π°Π·Π»ΠΈΡ‡Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ», ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, ΠΎΡ‚ Ρ„Π°ΠΉΠ»Π°, Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

49 main(argc, argv) /* int main(int argc, char **argv) */

50 char *argv[];

51 {

52  int i;

53  register struct lbuf *ep, **ep1; /* ОбъявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ */

54  register struct lbuf **slastp;

55  struct lbuf **epp;

56  struct lbuf lb;

57  char *t;

58  int compar();

59

60  setbuf(stdout, stdbuf);

61  time(&lb.lmtime); /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя */

62  year = lb.lmtime - 6L*30L*24L*60L*60L; /* 6 мСсяцСв Π½Π°Π·Π°Π΄ */

Ѐункция main() начинаСтся с объявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (строки 52–58), устанавливая Π±ΡƒΡ„Π΅Ρ€ для стандартного Π²Ρ‹Π²ΠΎΠ΄Π°, получая врСмя дня (строки 60–61) ΠΈ вычисляя Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ сСкунд с Π½Π°Ρ‡Π°Π»Π° Π­ΠΏΠΎΡ…ΠΈ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡˆΠ΅ΡΡ‚ΠΈ мСсяцСв (строка 62). ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρƒ всСх констант Π΅ΡΡ‚ΡŒ суффикс L, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π½Π° использованиС Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ long.

63  if (--argc > 0 && *argv[1] == '-') {

64   argv++;

65   while (*++*argv) switch(**argv) { /* Π Π°Π·Π±ΠΎΡ€ ΠΎΠΏΡ†ΠΈΠΉ */

66

67   case 'a': /* ВсС элСмСнты ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° */

68    aflg++;

69    continue;

70

71   case 's': /* Π Π°Π·ΠΌΠ΅Ρ€ Π² Π±Π»ΠΎΠΊΠ°Ρ… */

72    sflg++;

73    statreq++;

74    continue;

75

76   case 'd': /* БвСдСния ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, Π½Π΅ содСрТаниС */

77    dflg++;

78    continue;

79

80   case 'g': /* Имя Π³Ρ€ΡƒΠΏΠΏΡ‹ вмСсто ΠΈΠΌΠ΅Π½ΠΈ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° */

81    gflg++;

82    continue;

83

84   case 'l': /* Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ листинг */

85    lflg++;

86    statreq++;

87    continue;

88

89   case 'r': /* ΠžΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ порядок сортировки */

90    rflg = -1;

91    continue;

92

93   case 't': /* Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π΅ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ */

94    tflg++;

95    statreq++;

96    continue;

97

98   case 'u': /* ВрСмя доступа, Π° Π½Π΅ измСнСния */

99    uflg++;

100   continue;

101

102  case 'c': /* ВрСмя измСнСния индСкса, Π° Π½Π΅ Ρ„Π°ΠΉΠ»Π° */

103   cflg++;

104   continue;

105

106  case 'i': /* Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ индСкса */

107   iflg++;

108   continue;

109

110  case 'f': /* Π€ΠΎΡ€ΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ arg ΠΊΠ°ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° */

111   fflg++;

112   continue;

113

114   default: /* НСзнакомыС Π±ΡƒΠΊΠ²Ρ‹ ΠΎΠΏΡ†ΠΈΠΉ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ */

115    continue;

116  }

117  argc--;

118 }

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 63–118 Ρ€Π°Π·Π±ΠΈΡ€Π°ΡŽΡ‚ ΠΎΠΏΡ†ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ€ΡƒΡ‡Π½ΠΎΠΉ Ρ€Π°Π·Π±ΠΎΡ€ ΠΊΠΎΠ΄Π°: getopt() Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»Π° ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½Π°. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ statreq устанавливаСтся Π² true, ΠΊΠΎΠ³Π΄Π° опция Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ использования систСмного Π²Ρ‹Π·ΠΎΠ²Π° stat().

ИзбСТаниС Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° stat() для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π΄Π°Π΅Ρ‚ большой Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’Ρ‹Π·ΠΎΠ² stat() Π±Ρ‹Π» Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ Π΄ΠΎΡ€ΠΎΠ³ΠΈΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΌΠΎΠ³ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ поиск располоТСния индСкса Π½Π° Ρ„Π°ΠΉΠ»Π΅, дисковоС Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ для получСния индСкса, Π° Π·Π°Ρ‚Π΅ΠΌ поиск Π½Π° дискС располоТСния содСрТимого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° (для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ элСмСнтов ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°).

Π’ соврСмСнных систСмах индСксы находятся Π² Π³Ρ€ΡƒΠΏΠΏΠ°Ρ…, распрСдСлСнных ΠΏΠΎ всСй Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС, вмСсто объСдинСния ΠΈΡ… вмСстС Π² Π½Π°Ρ‡Π°Π»Π΅. Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹ΠΉ прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π²Ρ‹Π·ΠΎΠ²Ρ‹ stat() Π΄ΠΎ сих ΠΏΠΎΡ€ Π½Π΅ бСсплатны, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… лишь ΠΏΡ€ΠΈ нСобходимости, Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅.

119 if (fflg) { /* -f Π°Π½Π½ΡƒΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ -l, -s, -t, добавляя -a */

120  aflg++;

121  lflg = 0;

122  sflg = 0;

123  tflg = 0;

124  statreq = 0;

125 }

126 if (lflg) { /* ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏ */

127  t = "/etc/passwd";

128  if (gflg)

129   t = "/etc/group";

130  pwdf = fopen(t, "r");

131 }

132 if (argc==0) { /* Если Π½Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ */

133  argc++;

134  argv = &dotp - 1;

135 }

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 119–125 ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΎΠΏΡ†ΠΈΡŽ -f, Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π°Ρ -l, -s, -t ΠΈ statreq. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 126–131 ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ -l, устанавливая для Ρ„Π°ΠΉΠ»Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ свСдСний ΠΎ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΠ΅. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ V7 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ лишь ΠΎΠ΄Π½ΠΎ ΠΈΠ· этих свСдСний, Π½ΠΎ Π½Π΅ ΠΎΠ±Π°.

Если Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² большС Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ, строки 132–135 ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ argv Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° строку, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. НазначСниС 'argr = &dotp - 1' Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, хотя ΠΈ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ. '- 1' компСнсируСт '++argv' Π² строкС 137. Π­Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π² Π³Π»Π°Π²Π½ΠΎΠΉ части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ случая для 'argc == 1'.

136  for (i=0; i < argc; i++) { /* ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ свСдСния ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ */

137   if ((Π΅Ρ€ = gstat(*++argv, 1))==NULL)

138    continue;

139   ep->ln.namep = *argv;

140   ep->lflags |= ISARG;

141  }

142  qsort(firstp, lastp - firstp, sizeof *lastp, compar);

143  slastp = lastp;

144  for (epp=firstp; epp<slastp; epp++) { /* Π“Π»Π°Π². ΠΊΠΎΠ΄, см. тСкст */

145   Π΅Ρ€ = *epp;

146   if (ep->ltype=='d' && dflg==0 || fflg) {

147    if (argc>1)

148     printf("\n%s:\n", ep->ln.namep);

149    lastp = slastp;

150    readdir(ep->ln.namep);

151    if (fflg==0)

152     qsort(slastp, lastp - slastp, sizeof *lastp, compar);

153    if (lflg || sflg)

154     printf("total %D\n", tblocks);

155    for (ep1=slastp; ep1<lastp; ep1++)

156     pentry(*ep1);

157   } else

158   pentry(ep);

159  }

160  exit(0);

161 } /* ΠšΠΎΠ½Π΅Ρ† main() */

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 136–141 ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°ΡŽΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, собирая свСдСния ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ gstat() Π±ΡƒΠ»Π΅Π²Ρ‹ΠΉ: true, Ссли имя являСтся Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС false. Π‘Ρ‚Ρ€ΠΎΠΊΠ° 140 добавляСт Ρ„Π»Π°Π³ ISARG ΠΊ полю lflags для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.

Ѐункция gstat() добавляСт ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π½ΠΎΠ²ΡƒΡŽ struct lbuf ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ массиву flist (строка 137). Она Ρ‚Π°ΠΊΠΆΠ΅ обновляСт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ lastp, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π» Π² этом массивС Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ послСдний элСмСнт.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 142–143 ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ массив, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ qsort(), ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ lastp Π² slastp. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 144–159 ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°ΡŽΡ‚ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт массива, выводя ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ свСдСния ΠΎ Ρ„Π°ΠΉΠ»Π΅ ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅.

Код для ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² заслуТиваСт дальнСйшСго объяснСния:

if (ep->ltype=='d' && dflg==0 || fflg) ...

Π‘Ρ‚Ρ€ΠΎΠΊΠ° 146. Если Ρ„Π°ΠΉΠ» являСтся ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ ΠΈ -d Π½Π΅ прСдусмотрСно ΠΈΠ»ΠΈ Π±Ρ‹Π»ΠΎ установлСно -f, ls Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ свСдСния ΠΎ самом ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅.

if (argc>1) printf ("\n%s:\n", ep->ln.namep)

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 147–148. Выводят имя ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅, Ссли Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС Π±Ρ‹Π»ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΎ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ².

lastp = slastp;

readdir(ep->ln.namep)

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 149–150. Π’ΠΎΡΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ lastp ΠΈΠ· slastp. Массив flist дСйствуСт ΠΊΠ°ΠΊ Π΄Π²ΡƒΡ…ΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΉ стСк ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ². АргумСнты ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки хранятся с firstp Π΄ΠΎ slastp - 1. Когда readdir() Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, ΠΎΠ½Π° ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ структуры struct lbuf для содСрТимого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π² стСк, начиная с slastp ΠΈ Π΄ΠΎ lastp. Π­Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 7.1.