Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2015, 21:28   #1
sky_diver89
 
Регистрация: 18.08.2014
Сообщений: 4
По умолчанию C++ Linux Многопроцессный вывод содержимого директорий

Здравствуйте, необходимо вывести содержимое директорий на консоль. Максимальное количество процессов для вывода должно быть не более 6. Я набросал программу, которая выводит содержимое директорий, но создается огромное количество процессов, а нужно всего 6.

Код:
#include <dirent.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
 
void direct(char *folder);
char *Patch(char *a, char *b);
void get_proc();
void set_proc(pid_t pid1);
 
int max;
pid_t proc_max[100];
 
void *Thread1(void *arg)
{
        int j;
        pid_t a;
        while(1)
        {
                for(int i = 0; i < max; i++)
                {
                        if(proc_max[i] == 0) continue;
                        a = waitpid(proc_max[i],&j,WNOHANG);
                        if(a == -1)
                        {
                                if(errno == ECHILD) proc_max[i] = 0;
                        }
                        else proc_max[i] = 0;
                }
        }
}
 
int main()
{
        pthread_t thread1;
        max = 6;
        char str[] = "/home";
        pthread_create(&thread1, NULL, Thread1, NULL);
        direct(str);
}
 
void direct(char *folder)
{
        int g;
        pid_t pid1;
        char *buf1, *fpatch, *slash = "/";
        DIR *dir1;
        struct dirent *a;
        struct stat st;
        if(folder[strlen(folder)-1] != '/')
        fpatch = Patch(folder,slash);
        else fpatch = Patch(folder,"");
        dir1 = opendir(fpatch);
        while(a = readdir(dir1))
        {
                if((!(strcmp(a->d_name,".")))||(!(strcmp(a->d_name,"..")))) continue;
                buf1 = Patch(fpatch,a->d_name);
                printf("pid=%d %s\n",getpid(),buf1);
                if(stat(buf1,&st) == -1)
                {
                        printf("Невозможно открыть файл %s\n",buf1);
                        free(buf1);
                        buf1 = NULL;
                        continue;
                }
                if(S_ISDIR(st.st_mode))
                {
                        get_proc();
                        pid1 = fork();
                        if(pid1 == 0)
                        {
                                direct(buf1);
                        }
                        else
                                set_proc(pid1);
                }
        }
}
 
char *Patch(char *a, char *b)
{
        int size;
        char *ret;
        size = strlen(a) + strlen(b) + 1;
        ret = (char*) malloc(size);
        ret[0] = '\0';
        strcat(ret,a);
        strcat(ret,b);
        return(ret);
}
 
void set_proc(pid_t pid1)
{
        int i;
        bool flag = true;
        do
        {
                for(i=0; i < max; i++)
                        if(proc_max[i] == 0);
                        {
                                proc_max[i] = pid1;
                                flag = false;
                                break;
                        }
        }
        while(flag);
}
 
void get_proc()
{
        int i, n;
        do
        {
                n = 0;
                for(i = 0; i < max; i++)
                        if(proc_max[i] != 0) n++;
        }
        while(n >= max);
}
Может у кого-нибудь есть идеи как это сделать? Спасибо.
sky_diver89 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод содержимого из бд Govers PHP 2 28.04.2014 23:18
вывод содержимого файла mojohead C++ Builder 1 17.05.2011 01:18
Программа анализа содержимого каталогов (на ассемблере под Linux) fantom_13 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 16.03.2011 00:29
вывод содержимого street-walker Помощь студентам 1 04.03.2010 21:03
Вывод содержимого images.. firmwares Мультимедиа в Delphi 2 02.02.2010 01:27