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

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

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

Для ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ увСдомлСния ΠΎ событии Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ fcntl() с ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ F_NOTIFY ΠΈ послСдним Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, Ρ€Π°Π²Π½Ρ‹ΠΌ Π½ΡƒΠ»ΡŽ.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° автоматичСски отмСняСтся послС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ сигнала. Для эффСктивного увСдомлСния ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ для fcntl() Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ объСдинСн ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ "Π˜Π›Π˜" с DN_MULTISHOT, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ сигналов для всСх подходящих событий Π΄ΠΎ ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ увСдомлСния.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для увСдомлСния ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° пСрСдаСтся SIGIO. Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΆΠ΅Π»Π°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для этого Π΄Ρ€ΡƒΠ³ΠΎΠΉ сигнал (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ€Π°Π·Π½Ρ‹Π΅ сигналы), ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ F_SETSIG Π² fcntl(), Π° Π² качСствС послСднСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹ΠΉ сигнал. Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ F_SETSIG (Π΄Π°ΠΆΠ΅ Ссли установлСн сигнал SIGIO), ядро Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ дСскриптор Π½Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π² элСмСнтС si_fd Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигналов siginfo_t[103], позволяя ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² обновились[104].

Если контролируСтся нСсколько ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΈ для всСх ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Π²Ρ‹Π±Ρ€Π°Π½ ΠΎΠ΄ΠΈΠ½ сигнал, ΠΊΡ€Π°ΠΉΠ½Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сигнал Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ· событий Π½Π΅ Π·Π°Ρ‚Π΅Ρ€ΡΠ»ΠΎΡΡŒ.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ смСнС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° для Π²Ρ‹Π²ΠΎΠ΄Π° сообщСний ΠΎΠ± ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ Π»ΠΈΠ±ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Π»ΡŽΠ±Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Сю ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ (ΠΈΡ… количСство указываСтся Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС). Она отказываСтся ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ SIGRTMIN ΠΏΡ€ΠΈ смСнС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ si_fd, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π±Ρ‹Π» ΠΈΠ·ΠΌΠ΅Π½Π΅Π½. Π‘ Ρ†Π΅Π»ΡŒΡŽ прСдотвращСния условий состязаний ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сигналы с ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сигналов. Π‘ΠΈΠ³Π½Π°Π» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ доставлСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· β€” ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ sigsuspend() Π² строкС 203. Π­Ρ‚ΠΎ обСспСчиваСт ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ сканированиС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π² случаС внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π²ΠΎ врСмя Π΅Π³ΠΎ сканирования; ΠΈΠ½Π°Ρ‡Π΅ эти измСнСния останутся Π½Π΅Π·Π°ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΌΠΈ. ИспользованиС сигналов с ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π»ΡŽΠ±Ρ‹Π΅ измСнСния ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹; эти сигналы доставляСтся ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ sigsuspend(), гарантируя, Ρ‡Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½ΠΎ.

  1: /* dirchange.с */

  2:

  3: #define _GNU_SOURCE

  4: #include <dirent.h>

  5: #include <errno.h>

  6: #include <fcntl.h>

  7: #include <signal.h>

  8: #include <stdio.h>

  9: #include <stdlib.h>

 10: #include <string.h>

 11: #include <unistd.h>

 12:

 13: /* Для сохранСния ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ связный

 14:    ΡΠΏΠΈΡΠΎΠΊ. ПолС exists слуТит для хранСния слуТСбной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ

 15:    ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. */

 16: struct fileInfo {

 17:  char * name;

 18:  struct fileInfo * next;

 19:  int exists;

 20: };

 21:

 22: /* Π­Ρ‚ΠΎ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ массив. Он ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ дСскрипторы Π½Π° ΠΏΡƒΡ‚ΠΈ

 23:    ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², сохраняСт список Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΈ прСдоставляСт

 24:    ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ сигналов мСсто для отобраТСния Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³

 25:    Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. ПослСдний элСмСнт ΠΈΠΌΠ΅Π΅Ρ‚ path,

 26:    Ρ€Π°Π²Π½Ρ‹ΠΉ NULL, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ½Π΅Ρ† массива. */

 27:

 28: struct directoryInfo {

 29:  char * path;

 30:  int fd;

 31:  int changed;

 32:  struct fileInfo * contents;

 33: } * directoryList;

 34:

 35: /* Π­Ρ‚ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ пустой список; любой ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ содСрТит,

 36:    ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, "." ΠΈ ".." */

 37: int buildDirectoryList(char * path, struct fileInfo ** listPtr) {

 38:  DIR * dir;

 39:  struct dirent * ent;

 40:  struct fileInfo * list = NULL;

 41:

 42:  if (!(dir = opendir(path))) {

 43:   perror("opendir");

 44:   return 1;

 45:  }

 46:

 47:  while ((ent = readdir(dir))) {

 48:   if (!list) {

 49:    list = malloc(sizeof(*list));

 50:    list->next = NULL;

 51:    *listPtr = list;

 52:   } else {

 53:    list->next = malloc(sizeof(*list));

 54:    list = list->next;

 55:   }

 56:

 57:   list->name = strdup(ent->d_name);

 58:  }

 59:

 60:  if (errno) {

 61:   perror("readdir");

 62:   closedir(dir);

 63:   return 1;

 64:  }

 65:

 66:  closedir(dir);

 67:

 68:  return 0;

 69: }

 70:

 71: /* Π‘ΠΊΠ°Π½ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΡƒΡ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π² поисках ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ

 72:    содСрТимого, ΠΊΠ°ΠΊ ΡƒΠΊΠ°Π·Π°Π½ΠΎ *listPtr. Бвязанный список

 73:    обновляСтся Π½ΠΎΠ²Ρ‹ΠΌ содСрТимым, ΠΈ выводятся сообщСния,

 74:    ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π΄ΡˆΠΈΠ΅ измСнСния. */

 75: int updateDirectoryList(char * path, struct fileInfo ** listPtr) {

 76:  DIR * dir;

 77:  struct dirent * ent;

 78:  struct fileInfo * list = *listPtr;

 79:  struct fileInfo * file, * prev;

 80:

 81:  if (!(dir = opendir(path))) {

 82:   perror("opendir");

 83:   return 1;

 84:  }

 85:

 86:  for (file = list; file; file = file->next)

 87:   file->exists = 0;

 88:

 89:  while ((ent = readdir(dir))) {

 90:   file = list;

 91:   while (file && strcmp(file->name, ent->d_name))

 92:    file = file->next;

 93:

 94:   if (!file) {

 95:    /* Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ», Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ имя Π² список */

 96:    printf("%s создан Π² %s\n", ent->d_name, path);

 97:    file = malloc(sizeof(*file));

 98:    file->name = strdup(ent->d_name);

 99:    file->next = list;

100:    file->exists = 1;

101:    list = file;

102:   } else {

103:    file->exists = 1;

104:   }

105:  }

106:

107:  closedir(dir);

108:

109:  file = list;

110:  prev = NULL;

111:  while (file) {

112:   if (!file->exists) {

113:    printf("%s ΡƒΠ΄Π°Π»Π΅Π½ ΠΈΠ· %s\n", file->name, path);

114:    free(file->name);

115:

116:    if (!prev) {

117:     /* ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΉ ΡƒΠ·Π΅Π» */

118:     list = file->next;

119:     free(file);

120:     file = list;

121:    } else {

122:     prev->next = file->next;

123:     free(file);

124:     file = prev->next;

125:    }

126:   } else {

127:    prev = file;

128:    file = file->next;

129:   }

130:  }

131:

132:  *listPtr = list;

133:

134:  return 0;

135: }

136:

137: void handler(int sig, siginfo_t * siginfo, void * context) {

138:  int i;

139:

140:  for (i = 0; directoryList[i].path; i++) {

141:   if (directoryList[i].fd == siginfo->si_fd) {

142:    directoryList[i].changed = 1;

143:    return;

144:   }

145:  }

146: }

147:

148: int main(int argc, char ** argv) {

149:  struct sigaction act;

150:  sigset_t mask, sigio;

151:  int i;

152:

153:  /* Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ SIGRTMIN. ΠœΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½ΠΈΠ³Π΄Π΅,

154:     ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ°ΠΊ Π²Π½ΡƒΡ‚Ρ€ΠΈ систСмного Π²Ρ‹Π·ΠΎΠ²Π° sigsuspend(). */

155:  sigemptyset(&sigio);

156:  sigaddset(&sigio, SIGRTMIN);

157:  sigprocmask(SIG_BLOCK, &sigio, &mask);

158:

159:  act.sa_sigaction = handler;

160:  act.sa_flags = SA_SIGINFO;

161:  sigemptyset(&act.sa_mask);

162:  sigaction(SIGRTMIN, &act, NULL);

163:

164:  if (!argv[1]) {

165:   /* Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ, привСсти argc/argv

166:      ΠΊ Π²ΠΈΠ΄Ρƒ ".", ΠΊΠ°ΠΊ Π±ΡƒΠ΄Ρ‚ΠΎ пСрСдаСтся СдинствСнный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ */

167:   argv[1] = ".";

168:   argc++;

169:  }

170:

171:  /* ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ прСдставляСт собой отслСТиваСмый ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ */

172:  directoryList = malloc(sizeof(*directoryList) * argc);

173:  directoryList[argc - 1].path = NULL;

174:

175:  for (i = 0; i < (argc - 1); i++) {

176:   directoryList[i].path = argv[i + 1];

177:   if ((directoryList[i].fd =

178:    open(directoryList[i].path, O_RDONLY)) < 0) {

179:    fprintf(stderr, "ошибка ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ %s: %s\n",

180:    directoryList[i].path, strerror(errno));

181:    return 1;

182:   }

183:

184:   /* ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ сканированиСм;

185:      это Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π·Π°Ρ…Π²Π°Ρ‚ΠΈΠΌ Ρ„Π°ΠΉΠ»Ρ‹, созданныС ΠΊΠ΅ΠΌ-Ρ‚ΠΎ

186:      Π²ΠΎ врСмя сканирования ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. Если ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ Π΅Π³ΠΎ,

187:      Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрирован сигнал (ΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½, ΠΏΠΎΠΊΠ°

188:      ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ Π΅Π³ΠΎ) */

189:   if (fcntl(directoryList[i].fd, F_NOTIFY, DN_DELETE |

190:    DN_CREATE | DN_RENAME | DN_MULTISHOT) ) {

191:    perror("fcntl F_NOTIFY");

192:    return 1;

193:   }

194:

195:   fcntl(directoryList[i].fd, F_SETSIG, SIGRTMIN);