私のOSはUbuntuです。システム プログラミング設計の宿題のために C でプログラミングしています。「inotify()」を使用して、他の通常のファイルとシンボリック リンクを含めずに、ディレクトリとそのすべてのサブディレクトリを inotify しますが、ディレクトリを削除すると、パフォーマンスに奇妙な反応を示します。ただし、イベント->名前が空であるか、ASCII文字ではないなどの問題があり、親ディレクトリはディレクトリが削除されていることを示しています。
この場合、どうすれば修正できますか?後者のみが発生することを望んでいますが、前者は発生しません。
static int begin_hear(csiebox_client *client, hash *hash_ptr, int fd, hash *hash_hdlnk){
int length, i = 0;
//int fd;
int wd;
char buffer[EVENT_BUF_LEN];
memset(buffer, 0, EVENT_BUF_LEN);
//create a instance and returns a file descriptor
//fd = inotify_init();
if (fd < 0) {
perror("inotify_init");
}
//add directory "." to watch list with specified events
//wd = inotify_add_watch(fd, "../cdirs", IN_CREATE | IN_DELETE | IN_ATTRIB | IN_MODIFY);
while ((length = read(fd, buffer, EVENT_BUF_LEN)) > 0) {
i = 0;
while (i < length) {
struct inotify_event* event = (struct inotify_event*)&buffer[i];
fprintf(stderr, "event: (%d, %zd, %s)\ntype: ", event->wd, strlen(event->name), event->name);
char *wd_path;
char *pathname;
pathname = (char*)malloc(PATH_MAX);
memset(pathname, 0, sizeof(pathname));
if(get_from_hash(hash_ptr, (void**)&wd_path, event->wd) == 0){
fprintf(stderr, "not in hash\n");
}
fprintf(stderr, "wd_path is %s\n", wd_path);
strcpy(pathname, wd_path);
//whether it's a dir
if(event->mask & IN_ISDIR){
if(event->mask & IN_CREATE){
strcat(pathname, "/");
strcat(pathname, event->name);
int wd;
wd = inotify_add_watch(fd, pathname, IN_CREATE | IN_DELETE | IN_ATTRIB | IN_MODIFY);
fprintf(stderr, "wd = %d\n", wd);
struct stat sb;
if(lstat(pathname, &sb) == -1){
fprintf(stderr, "lstat fail\n");
}
//want to sync the create-directory request to server
}
else if(event->mask & IN_DELETE){
strcat(pathname, "/");
strcat(pathname, event->name);
//want to sync the delete-directory request to server
}
}
else{ //symbolic link, regular file, or other hardlink
strcat(pathname, "/");
strcat(pathname, event->name);
int hardlinkkey;
if(event->mask & IN_CREATE){
struct stat sb;
if(lstat(pathname, &sb) == -1){
fprintf(stderr, "pathname is %s\n", pathname);
fprintf(stderr, "lstat fail\n");
}
if(S_ISREG(sb.st_mode)){
//want to sync the reg file to server
}
if(S_ISLNK(sb.st_mode)){
//want to sync the symbolic link to server
}
}
else if(event->mask & IN_ATTRIB || event->mask & IN_MODIFY){
if(lstat(pathname, &sb) == -1){
fprintf(stderr, "lstat fail\n");
}
if(S_ISREG(sb.st_mode)){
//want to sync the reg file to server
}
if(S_ISLNK(sb.st_mode)){
//want to sync the symbolic link to server
}
}
else if(event->mask & IN_DELETE){
//want to sync the remove request to server
}
}
i += EVENT_SIZE + event->len;
}
memset(buffer, 0, EVENT_BUF_LEN);
//inotify_rm_watch(fd, wd);
}
close(fd);
return 0;
}