| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > ограничение количества процессов |
| Автор: Teresh 1.4.2010, 23:31 |
| Главный процесс открывает каталог и запускает для каждого файла каталога и всех подкаталогов отдельный процесс. Каждый процесс выводит на экран свой 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 2.4.2010, 10:24 |
| Порождение процессов в цикле + использование семафора с начальным значением N. При создании нового процесса семафор уменьшаем на единицу, при завершении процесса, увеличиваем. Почитайте про семафоры. |
| Автор: xvr 2.4.2010, 11:20 |
| В добавление к семафору могу посоветовать запускать процессы в процедуре search на каждый найденный каталог. После fork'а процесс должен запустить search рекурсивно на найденный каталог. |
| Автор: Teresh 2.4.2010, 14:52 |
| Спасибо!!! Буду пробовать |