Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

 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);

  • Читать дальше
  • 1
  • ...
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: