ΠΠ»Ρ ΠΎΡΠΌΠ΅Π½Ρ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΎ ΡΠΎΠ±ΡΡΠΈΠΈ Π²ΡΠ·ΠΎΠ²ΠΈΡΠ΅ 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);