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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² срСдС Linux. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 69

Автор Майкл ДТонсон

329: case '\\':

330:  src++;

331:  if (!*src) {

332:   freeJob(job);

333:   fprintf(stderr, "послС \\ оТидался символ\n");

334:   return 1;

335:  }

336:  if (* src == '*' || *srс == '[' | | *src == ']'

337:   || *srс == '?')

338:   *buf++ = '\\';

339:  /* сквозная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° */

340: default:

341:  *buf++ = *src;

Для Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π½Π°ΠΊΠΎΠ² унивСрсализации Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ здСсь Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый ΠΊΠΎΠ΄.

Π­Ρ‚ΠΈ Π΄Π²Π΅ ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² glob() Π±Π΅Π· поиска Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Ρ… совпадСний.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ globLastArgument(), которая унивСрсализируСт самый послСдний Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ для Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π·Π°ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ Π»ΡŽΠ±Ρ‹ΠΌ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΌ совпадСниСм.

Для облСгчСния управлСния памяти ΠΊ struct childProgram добавляСтся элСмСнт globResult Ρ‚ΠΈΠΏΠ° glob_t, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для хранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² всСх ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ унивСрсализации. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, добавляСтся цСлочислСнный элСмСнт freeGlob, Π½Π΅ Ρ€Π°Π²Π½Ρ‹ΠΉ Π½ΡƒΠ»ΡŽ, Ссли freeJob() Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ globResult. НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ΅ описаниС struct childProgram Π² ladsh3.c.

35: struct childProgram {

36:  pid; /* 0, Ссли Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π° */

37:  char ** argv; /* имя ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ */

38:  int numRedirections; /* элСмСнты Π² массивС ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΉ */

39:  struct redirection Specifier * redirections; /* пСрСнаправлСния Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° */

40:  glob_t globResult; /* Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ унивСрсализации ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² */

41:  int freeGlob; /* Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ globResult? */

42: };

Π’ΠΎ врСмя ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ запуска для ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки функция globLastArgument() (ΠΊΠΎΠ³Π΄Π° argc для Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Ρ€Π°Π²Π½ΠΎ 1) ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ globResult. Для ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΎΠ½Π° ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ прСимущСством GLOB_APPEND для добавлСния Π½ΠΎΠ²Ρ‹Ρ… совпадСний ΠΊ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ. Π­Ρ‚ΠΎ избавляСт ΠΎΡ‚ нСобходимости распрСдСлСния собствСнной памяти для Ρ†Π΅Π»Π΅ΠΉ унивСрсализации, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ glob_t ΠΏΡ€ΠΈ нСобходимости автоматичСски Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ΡΡ.

Если globLastArgument() Π½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ совпадСний, символы \ с ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°ΠΌΠΈ ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС всС Π½ΠΎΠ²Ρ‹Π΅ совпадСния ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², создаваСмый для Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° полная рСализация globLastArgument(). ВсС слоТныС Π΅Π΅ части относятся ΠΊ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ; фактичСская унивСрсализация ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ globit.с, которая прСдставлСна Ρ€Π°Π½Π΅Π΅ Π² Π³Π»Π°Π²Π΅.

 87: void globLastArgument(struct childProgram * prog, int * argcPtr,

 88:  int * argcAllocedPtr) {

 89:  int argc = *argcPtr;

 90:  int argcAlloced = *argcAllocedPtr;

 91:  int rc;

 92:  int flags;

 93:  int i;

 94:  char * src, * dst;

 95:

 96:  if (argc >1) {/* cmd->globResult ΡƒΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ */

 97:   flags = GLOB_APPEND;

 98:   i = prog->globResult.gl_pathc;

 99:  } else {

100:   prog->freeGlob = 1;

101:   flags = 0;

102:   i = 0;

103:  }

104:

105:  rc = glob(prog->argv[argc - 1], flags, NULL, &prog->globResult);

106:  if (rc == GLOB_NOSPACE) {

107:   fprintf (stderr, "Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ памяти для выполнСния унивСрсализации\n");

108:   return;

109:  } else if (rc == GLOB_NOMATCH ||

110:   (!rc && (prog->globResult.gl_path - i) == 1 &&

111:   !strcmp(prog->argv[argc - 1],

112:   prog->globResult.gl_pathv[i]))) {

113:    /* Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ Π² \, Ссли ΠΎΠ½ΠΈ всС Π΅Ρ‰Π΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ */

114:    src = dst = prog->argv[argc - 1];

115:    while (*src) {

116:     if (*src ! = '\\') *dst++ = *src;

117:     src++;

118:    }

119:    *dst = '\0';

120:   } else if (!rc) {

121:   argcAlloced += (prog->globResult.gl_pathc - i);

122:   prog->argv = realloc(prog->argv,

123:   argcAlloced * sizeof(*prog->argv));

124:   memcpy(prog->argv + (argc - 1),

125:    prog->globResult.gl_pathv + i,

126:    sizeof(*(prog->argv)) *

127:    (prog->globResult.gl_pathc - i));

128:   argc += (prog->globResult.gl_pathc - i - 1);

129:  }

130:

131:  *argcAllocedPtr = argcAlloced;

132:  *argcPtr = argc;

133: }

ПослСдними измСнСниями ΠΊΠ°ΡΠ°ΡŽΡ‚ΡΡ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² globLastArgument(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒΡΡ послС синтаксичСского Ρ€Π°Π·Π±ΠΎΡ€Π° Π½ΠΎΠ²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π’Ρ‹Π·ΠΎΠ²Ρ‹ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Π΄Π²ΡƒΡ… мСстах: ΠΊΠΎΠ³Π΄Π° Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ строки Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ… Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈ ΠΊΠΎΠ³Π΄Π° вся командная строка Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½Π°. Оба Π²Ρ‹Π·ΠΎΠ²Π° выглядят ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

globLastArgument(prog, &argc, &argvAlloced);

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ladsh3.с доступСн Π½Π° Web-сайтС ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π° сайтС, посвящСнном ΠΊΠ½ΠΈΠ³Π΅.

14.7. ΠžΠ±Ρ…ΠΎΠ΄ Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… систСм

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π»Π΅Π³Ρ‡Π°ΡŽΡ‚ прилоТСниям просмотр всСх Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ„Π°ΠΉΠ»Ρ‹ Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…. РСкурсивный просмотр всСх элСмСнтов Π΄Ρ€Π΅Π²ΠΎΠ²ΠΈΠ΄Π½ΠΎΠΉ структуры (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы) часто называСтся ΠΎΠ±Ρ…ΠΎΠ΄ΠΎΠΌ (walk) Π΄Π΅Ρ€Π΅Π²Π° ΠΈ ΠΎΠ½ рСализуСтся функциями ftw() ΠΈ nftw(). nftw() прСдставляСт собой ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ftw.

14.7.1. ИспользованиС ftw()

#include <ftw.h>


int ftw(const char *dir, ftwFunctionPointer callback, int depth);

Ѐункция ftw() Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° dir ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π² callback Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² этом ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…. Ѐункция вызываСтся для всСх Ρ‚ΠΈΠΏΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ символичСскиС ссылки ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ. РСализация ftw() ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ дСскриптора) ΠΈ для увСличСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ…, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ всСх элСмСнтов ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ количСство Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов, Ρ€Π°Π²Π½ΠΎΠ΅ количСству ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ². Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ нСдостаток Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ depth ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ количСство Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов ftw(), ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ. Если этот ΠΏΡ€Π΅Π΄Π΅Π» достигаСтся, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ сниТаСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ часто ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ.

Ѐункция, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ callback, опрСдСляСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

int ftwCallbackFunction(const char * file, const struct stat * sb, int flag);

Π­Ρ‚Π° функция вызываСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² Π΄Π΅Ρ€Π΅Π²Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, file, прСдставляСт собой имя Ρ„Π°ΠΉΠ»Π°, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π΅ΡΡ с dir, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ пСрСдаСтся ftw(). НапримСр, Ссли Π±Ρ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ dir ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π» Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ., ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΈΠΌΠ΅Π½ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ./bashrc. Если Π±Ρ‹ вмСсто этого использовалось /etc, имя Ρ„Π°ΠΉΠ»Π° выглядСло Π±Ρ‹ ΠΊΠ°ΠΊ /etc/hosts.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°, sb, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° структуру struct stat ΠΊΠ°ΠΊ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ примСнСния stat() ΠΊ Ρ„Π°ΠΉΠ»Ρƒ[102]. АргумСнт flag прСдоставляСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ„Π°ΠΉΠ»Π΅ ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ.

FTW_F Π€Π°ΠΉΠ» Π½Π΅ являСтся символичСской ссылкой ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ. FTW_D Π€Π°ΠΉΠ» являСтся ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ Π»ΠΈΠ±ΠΎ символичСской ссылкой, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Π½Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³. FTW_DNR Π€Π°ΠΉΠ» являСтся ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ, ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡ‡ΠΈΠΉ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρƒ прилоТСния Π½Π΅Ρ‚ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΠ±Ρ…ΠΎΠ΄ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½). FTW_SL Π€Π°ΠΉΠ» являСтся символичСской ссылкой. FTW_NS Π€Π°ΠΉΠ» являСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ stat(). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΠΏΡ€Π°Π²Π° Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ (ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ список Ρ„Π°ΠΉΠ»ΠΎΠ² этого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°), Π½ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²Π° Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ (Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² stat() ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ этого ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°).

Когда Ρ„Π°ΠΉΠ» являСтся символичСской ссылкой, ftw() пытаСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π·Π° этой ссылкой ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ„Π°ΠΉΠ»Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ (ftw() ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ нСсколько Ρ€Π°Π·, Ссли Π½Π° Π½Π΅Π³ΠΎ имССтся нСсколько символичСских ссылок). Однако для ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π½ΠΎΠΉ ссылки Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ, вСрнСтся FTW_SL ΠΈΠ»ΠΈ FTW_NS. Π­Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ nftw().

Если функция ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ноль, ΠΎΠ±Ρ…ΠΎΠ΄ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° продолТаСтся. Если возвращаСтся Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΎΠ±Ρ…ΠΎΠ΄ Π΄Π΅Ρ€Π΅Π²Π° Ρ„Π°ΠΉΠ»ΠΎΠ² Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ ΠΈ эта Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° возвращаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ftw(). ΠŸΡ€ΠΈ ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΎΠ±Ρ…ΠΎΠ΄Π° ftw() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ноль, Π° Π² случаС ошибки возвращаСтся -1.

14.7.2. ΠžΠ±Ρ…ΠΎΠ΄ Π΄Π΅Ρ€Π΅Π²Π° Ρ„Π°ΠΉΠ»ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ nft()

Новая вСрсия ftw() β€” nftw() β€” Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ символичСских ссылок, присущих ftw(), ΠΈ содСрТит нСсколько Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… свойств. Π‘ Ρ†Π΅Π»ΡŒΡŽ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ опрСдСлСния nftw() Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ _XOPEN_SOURCE Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ 500 ΠΈΠ»ΠΈ большС. НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ nftw().