Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> fork(), exec*() problem; no idea! Проблема с созданием процессов. 
V
    Опции темы
TheObserver
Дата 28.9.2009, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 28.9.2009

Репутация: нет
Всего: нет



Доброго времени суток! Натолкните, плз, на мысль...
Дело вот в чём: написал программу, которая считает кол-во файлов и их размер в каждой папке начиная от заданной.

Но теперь мне необходимо, чтобы каждая папка обрабатывалась в отдельном процессе. Т.е. немного переписав (Приблизительно думаю, что программа будет создавать дочерний процесс, который заменяется отдельным, т.е. вызывает себя же и передаёт  в качестве аргумента путь к папке):

Код

#include  <stdio.h>
#include  <sys/types.h>
#include  <sys/stat.h>
#include  <dirent.h>
#include  <limits.h>

static int count = 0;
static off_t fsize = 0;


void child_handler(int i) 
{
   int status;
   wait(&status);
}

int main(int argc, const char **argv)
{
    
    char const *dir;
    char name[PATH_MAX];
    char namedir[PATH_MAX]; 
    char pathname[PATH_MAX]; 
    char *delim = "/";
    char *prog = "prog"; 
    char *buf;     //t
    DIR *d;
    struct dirent *dd;
    struct stat s;
    off_t o;

//_________________________________
int i, pid, status;
struct sigaction sa;
sa.sa_handler = child_handler;
sigaction(SIGCHLD, &sa, 0);
//_________________________________
        
    buf = getcwd(NULL, 1024); //t
    if (buf == NULL) //t
    {  //t
    fprintf(stderr, "getcwd() error\n"); //t
    return 1; //t
    } //t
    snprintf(pathname, PATH_MAX, "%s%s%s", buf, delim, prog); //t
  

//-------------------------------------------
pid = fork();


    



//-------------------------------------------
    
    if (argc == 1)
    {
    argv[1] = ".";
    argc = 2;
    }

    dir = argv[1];
    

    if (!strcmp(dir, "/")) delim = "";
 

    if (!(d = opendir(dir)))
    {
         perror(dir);
      return 1;    
    }

 
    while ((dd = readdir(d))) 
{
          if (!strcmp(dd->d_name, ".") || !strcmp(dd->d_name, ".."))
      continue;
    
     snprintf(name, PATH_MAX, "%s%s%s", dir, delim, dd->d_name);
    snprintf(namedir, PATH_MAX, "%s%s%s", buf, delim, dd->d_name);

   if (lstat(name, &s) < 0) continue;
    
    if (!(S_ISDIR(s.st_mode)))
    {
    count++;
    fsize += s.st_size;
    }
    
    if (S_ISDIR(s.st_mode))
    {
    printf("%s\n", namedir);
    //printf("%s\n", pathname);
    
            if (pid == 0)
            {
                execl(pathname, namedir);
                exit(0);
                perror("execl");
                   return EXIT_FAILURE;
            }
            else if (wait(&status) == -1)
             {
                 perror("wait");
                return EXIT_FAILURE;
               }    
            

    }

    

}

    printf("%s (contains %i file(s), their size is %li bytes)\n", dir, count, fsize);
    count=0;
    fsize=0;
    printf("PID: %i\n", pid); //t
    //printf("My programm: %s\n", pathname); //t
    //printf("My programm: %s\n", argv[0]); //t
closedir(d);
free(buf); //t
return 0;
}


Программа не создаёт новый процесс и не вызывает себя же... В упор не вижу в чём лажа... Тыкните пожалуйста пальцем, где фигня написана (Буду очень благодерен, если будет указано в чём проблема заключется)! 

Это сообщение отредактировал(а) TheObserver - 29.9.2009, 13:14
PM MAIL   Вверх
Void
Дата 28.9.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 3
Всего: 173



Прежде чем разбираться в коде...
Цитата(TheObserver @  28.9.2009,  17:21 Найти цитируемый пост)
программа будет создавать дочерний процесс, который заменяется отдельным, т.е. вызывает себя же и передаёт  в качестве аргумента путь к папке

Зачем такой изврат? При использовании fork аргумент в дочерний процесс можно передать обычной переменной.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
TheObserver
Дата 28.9.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 28.9.2009

Репутация: нет
Всего: нет



Цитата(Void @ 28.9.2009,  15:31)
Прежде чем разбираться в коде...
Цитата(TheObserver @  28.9.2009,  17:21 Найти цитируемый пост)
программа будет создавать дочерний процесс, который заменяется отдельным, т.е. вызывает себя же и передаёт  в качестве аргумента путь к папке

Зачем такой изврат? При использовании fork аргумент в дочерний процесс можно передать обычной переменной.

Изврат такой нужен, (может я и не прав, точно не уверен) чтобы PPID был не от моей программы, а  от консоли...

Это сообщение отредактировал(а) TheObserver - 28.9.2009, 15:48
PM MAIL   Вверх
MAKCim
Дата 28.9.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



execl нужно NULL в конце передать



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
TheObserver
Дата 29.9.2009, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 28.9.2009

Репутация: нет
Всего: нет



Цитата(MAKCim @ 28.9.2009,  16:59)
execl нужно NULL в конце передать

спасибо, но описание функции я знал,  а если передать в конце функции NULL, то происходит бесконечный цикл.
PM MAIL   Вверх
TheObserver
Дата 29.9.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 28.9.2009

Репутация: нет
Всего: нет



всё, проблема найдена... Неправильное формирование пути + необходимо указать execl(pathname, " ", namedir, NULL);
PM MAIL   Вверх
MAKCim
Дата 29.9.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



TheObserver, 
не "". а pathname


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.2637 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.