Мне было поручено создать программу, которая анализирует файл / каталог и предоставляет информацию о них. Вы можете установить флаг рекурсии для анализа каждого подкаталога. Каждый каталог анализируется новым процессом (это требование проекта), и я хочу отправлять сигнал каждый раз, когда обнаруживается новый файл (SIGUSR2) или каталог (SIGUSR1). В обработчике для этих сигналов я хочу увеличить глобальные переменные, которые отслеживают количество файлов / каталогов, найденных программой. У меня проблемы с тем, чтобы разные процессы увеличивали одну и ту же глобальную переменную. Я пробовал трубы, но я не могу заставить его работать.
Вот моя функция, которая анализирует каталог:
void process_dir(const ProgramConfig program_config, const char *dname, FILE *outstream)
{
raise(SIGUSR1);
/* Create a new process */
pid_t pid = fork();
if (pid == 0)
{
/* Child process */
struct dirent *ent;
DIR *dir;
/* Open directory */
if ((dir = opendir(dname)) != NULL)
{
/* Go through each file in this directory */
while ((ent = readdir(dir)) != NULL)
{
/* Ignore anything that isn't a file or a directory */
if (ent->d_type != DT_DIR && ent->d_type != DT_REG)
continue;
/* Ignore the '.' and '..' directories */
if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
continue;
/* Prepend this directory name to file name */
char name[256];
strcpy(name, dname);
strcat(name, "/");
strcat(name, ent->d_name);
if (ent->d_type == DT_DIR && program_config.r_flag)
{
/* Found a subdirectory, process it if -r flag enabled */
process_dir(program_config, name, outstream);
}
else
{
/* Found a file, process it */
process_file(program_config, name, outstream);
}
}
}
else
{
/* Error opening directory */
}
/* Exit from child process */
exit(0);
}
else if (pid < 0)
{
/* Error creating process */
}
else
{
/* Parent process */
wait(NULL);
/* Log this event */
if (program_config.v_flag)
{
char act[100];
sprintf(act, "PROCESSED DIR %s", dname);
log_event(act);
}
}
}
Вот мои обработчики:
void sigusr1_handler(int sig)
{
if (sig != SIGUSR1)
{
fprintf(stderr, "Wrong signal received! Expected: SIGUSR1\n");
}
dirsFound++;
printf("New directory: %ld/%ld directories/files at this time.\n", dirsFound, filesFound);
}
void sigusr2_handler(int sig)
{
if (sig != SIGUSR2)
{
fprintf(stderr, "Wrong signal received! Expected: SIGUSR2\n");
}
filesFound++;
}
Использование потоков не подходит для этого назначения.