![]() |
|
Модераторы: xvr |
![]()
|
|
| Teresh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
Главный процесс открывает каталог и запускает для каждого файла каталога и всех подкаталогов отдельный процесс. Каждый процесс выводит на экран свой pid. Число одновременно работающих процессов не должно превышать N (вводится пользователем).
У меня всегда только 2 процесса, а нужно больше и их нужно ограничивать этим самым N из условия. Помогите это сделать. Спасибо Вот, что у меня получилось #include <time.h> #include <stdio.h> #include <dirent.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <limits.h> #include <sys/time.h> #include <signal.h> #define N 256 int search(char *theDir, char *prog, char *number) { pid_t pid;; DIR *dir = NULL; struct dirent d; struct dirent *dp = NULL; struct stat info; int a; dir = opendir(theDir); if (dir == NULL) { fprintf(stderr, "%s : Error : %s: %s\n", prog, strerror(errno), theDir); return 0; } dp = readdir(dir); a = readdir_r(dir, &d, &dp); while (dp != NULL) { if ((pid=fork()) < 0) { fprintf(stderr,"%s: ERROR can't create child process\n",prog); return 1; } if (pid == 0) { if ((strcmp(d.d_name, ".") == 0) || (strcmp(d.d_name, "..") == 0)) { a = readdir_r(dir, &d, &dp); continue; } strcpy(name, theDir); strcat(name, "/"); strcat(name, dp->d_name); if (lstat(name, &info) == 0) { printf("%d\n", getpid()); a = readdir_r(dir, &d, &dp); continue; } exit(0); } else if (pid > 0) { a = readdir_r(dir, &d, &dp); exit(0); } } } int main(int argc, char* argv[]) { if (argc != 3) { fprintf(stderr, "%s : Error : Too few arguments \n", argv[0]); return 1; } search(argv[1], argv[0], argv[2]); return 0; } |
|||
|
||||
| Anark1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 622 Регистрация: 15.12.2006 Где: RF -> Moscow Репутация: нет Всего: 11 |
Порождение процессов в цикле + использование семафора с начальным значением N. При создании нового процесса семафор уменьшаем на единицу, при завершении процесса, увеличиваем.
Почитайте про семафоры. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
В добавление к семафору могу посоветовать запускать процессы в процедуре search на каждый найденный каталог. После fork'а процесс должен запустить search рекурсивно на найденный каталог.
Это сообщение отредактировал(а) xvr - 2.4.2010, 11:20 |
|||
|
||||
| Teresh |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 27 Регистрация: 1.4.2010 Репутация: нет Всего: нет |
Спасибо!!!
Буду пробовать |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |