在Linux系统中,readdir
函数用于从目录中读取一个条目
flock
函数对目录进行读取锁定。这可以确保在同一时间只有一个线程能够读取目录内容。在读取完成后,需要释放锁定。#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/file.h>
#include <pthread.h>
pthread_mutex_t dir_lock = PTHREAD_MUTEX_INITIALIZER;
void* read_directory(void* arg) {
DIR *dir;
struct dirent *entry;
char path[] = "/path/to/directory";
// 获取目录锁
pthread_mutex_lock(&dir_lock);
// 打开目录
dir = opendir(path);
if (dir == NULL) {
perror("opendir");
pthread_mutex_unlock(&dir_lock);
return NULL;
}
// 读取目录内容
while ((entry = readdir(dir)) != NULL) {
printf("Entry: %s\n", entry->d_name);
}
// 关闭目录
closedir(dir);
// 释放目录锁
pthread_mutex_unlock(&dir_lock);
return NULL;
}
int main() {
pthread_t threads[5];
int num_threads = 5;
// 创建多个线程
for (int i = 0; i < num_threads; i++) {
if (pthread_create(&threads[i], NULL, read_directory, NULL) != 0) {
perror("pthread_create");
exit(EXIT_FAILURE);
}
}
// 等待所有线程完成
for (int i = 0; i < num_threads; i++) {
pthread_join(threads[i], NULL);
}
// 销毁互斥锁
pthread_mutex_destroy(&dir_lock);
return 0;
}
readdir
实现,例如dirent.h
库中的readdir_r
函数。这个函数会在内部处理锁,因此你不需要手动管理锁。#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <pthread.h>
void* read_directory(void* arg) {
DIR *dir;
struct dirent entry;
char path[] = "/path/to/directory";
struct dirent *result;
// 打开目录
dir = opendir(path);
if (dir == NULL) {
perror("opendir");
return NULL;
}
// 读取目录内容
while ((result = readdir_r(dir, &entry)) != NULL) {
printf("Entry: %s\n", result->d_name);
}
// 关闭目录
closedir(dir);
return NULL;
}
int main() {
pthread_t threads[5];
int num_threads = 5;
// 创建多个线程
for (int i = 0; i < num_threads; i++) {
if (pthread_create(&threads[i], NULL, read_directory, NULL) != 0) {
perror("pthread_create");
exit(EXIT_FAILURE);
}
}
// 等待所有线程完成
for (int i = 0; i < num_threads; i++) {
pthread_join(threads[i], NULL);
}
return 0;
}
在这两个示例中,我们创建了5个线程,每个线程都会读取指定目录的内容。通过使用互斥锁或线程安全的readdir_r
函数,我们确保了在多线程环境下对目录的访问是安全的。