Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Управление процессами  (Прочитано 12443 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ZWYHB
Участник

ru
Offline Offline

« : 27-11-2009 12:34 » 

Необходимо реализовать функцию запуска и параллельного выполнения нескольких программ. Задаётся количество выполняемых программ и  набор их имён (пути к исполняемым образам). Исходный процесс завершается сразу после их порождения.
 Написать тестовую программу для проверки работоспособности разработанной функции.
 
Код:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
 
#define NPROC 2        /* количество процессов */
 
void fnc(char *);
 
int main(int argc, char* argv[])
{
    pid_t pids[NPROC];
    int i;
 

pBufData = new char[strlen(argv[i])+1];

if(!pBufData)
{
printf("\nNot enough memory");
return;
}
strcpy_s(pBufData, strlen(argv[i])+1, argv[i]);


    for(i = 0; i < NPROC; i++) {
        pids[i] = fork();

        if(pids[i] < 0)
        {
            perror("fork");

            return 1;

        } else if(!pids[i]) {    /* дочерний процесс */
            fnc("ls");           /* выполнение программы ls */
        }
    }
 
 
int func(int progCount, struct prog_descriptor const * progz, pid_t * pids);
{
    execl("/bin/ls", "ls", NULL);
 
    /* сюда попадем только в случае ошибки */

    abort();
}

Как здесь сделать так, чтобы количество процессов передавалось как параметр?
И с именами здесь, чувствую, косяки есть.
Помогите, пожалуйста, а то я уже устал Быть такого не может
« Последнее редактирование: 27-11-2009 17:25 от Sel » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 27-11-2009 12:47 » 

Читай ман на fork. процесс полностью копируется, следовательно, все переменные также копируются.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 28-11-2009 08:59 » 

Как здесь сделать так, чтобы количество процессов передавалось как параметр?

Не совсем понял: откуда и куда ты хочешь передать параметр?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
ZWYHB
Участник

ru
Offline Offline

« Ответ #3 : 28-11-2009 09:59 » 

RXL, сейчас количество процессов уже задано. Необходимо, чтобы пользователь сам определял их число.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 28-11-2009 09:59 » 

И в чем проблема то?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 28-11-2009 10:00 » 

У тебя в main определены параметры. Подумай зачем они нужны.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
ZWYHB
Участник

ru
Offline Offline

« Ответ #6 : 28-11-2009 10:30 » 

Я определяю int func(int progCount, struct prog_descriptor const * progz, pid_t * pids);
где prog_descriptor - блок параметров для запуска отдельной программы.
Функция main(), как я понимаю, должна вызывать функцию func() c нужными аргументами - как это записать?

Записан
ZWYHB
Участник

ru
Offline Offline

« Ответ #7 : 29-11-2009 15:29 » 

Код:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
    pid_t pid = -1;
    int i;
 
    for(i = 0; i < argc; i++) {                    /*цикл от нуля до количества параметров программы*/
        pid = fork(); /* "клонируем" наш процесс в памяти*/
        if(pid < 0) {                               /* если клонирование вернуло отрицательный результат - ошибка*/
            perror("fork");
            return 1;
        } else if(!pid) {        /* если это дочерний процесс */
       if(argv[i+1]) /* проверка - имеется ли какая либо строка в этом элементе*/
                                 execl(argv[i+1], NULL, NULL);         
          }
    }
    return 0;
}

как здесь сделать так, чтобы количество запускаемых программ определялось пользователем?

Т.е. число запускаемых программ будет содержатся в argv[1], берем его, преобразовываем в число и крутим цикл от 0 до числа в argv[1] , ну и дальше пробуем запускать остальные параметры, как программы, по порядку (argv[2], argv[3] и т.д.)

У меня никак не получается этот кусок!  Меня одолевают смутные сомнения
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #8 : 29-11-2009 17:14 » 

Я думаю безсмысленно делать первый параметр, чтоб был количеством запускаемых программ. Вполне достаточно списка запускаемых программ, который будет в аргументе запуска.
argv[0] содержит имя самой программы, так что его можно смело пропустить. Ну и тогда код упростится
Код:
   for(i = 1; i < argc; i++) {                    /*цикл от нуля до количества параметров программы*/
        pid = fork(); /* "клонируем" наш процесс в памяти*/
        if(pid < 0) {                               /* если клонирование вернуло отрицательный результат - ошибка*/
            perror("fork");
            return 1;
        } else if(!pid) {       /* если это дочерний процесс */
         execl(argv[i], NULL, NULL);          
          }
   }

В работе правда не проверял.

Это у тебя учебное задание? Потому что в принципе в bash это делается намного легче.
« Последнее редактирование: 29-11-2009 17:17 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
ZWYHB
Участник

ru
Offline Offline

« Ответ #9 : 29-11-2009 18:13 » 

Finch, да это учебное задание.
Я думаю безсмысленно делать первый параметр, чтоб был количеством запускаемых программ. Вполне достаточно списка запускаемых программ, который будет в аргументе запуска.
#define NPROC 2        /* количество процессов */   - ты имеешь ввиду это?
А здесь этого хватит?
В задании - Задаётся количество выполняемых программ и  набор их имён
То есть не надо этого? - введите количество процессов - непонятно.

Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 29-11-2009 18:32 » 

ZWYHB, Если у тебя задано в учебном задании, так как ты говориш. То скорее всего тебе надо читать с текстового файла. А это совсем другая история. И это решение не подходит для твоего случая.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
ZWYHB
Участник

ru
Offline Offline

« Ответ #11 : 29-11-2009 18:55 » 

Finch - Э, какого текстового файла?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #12 : 29-11-2009 19:47 » 

Читай внимательно свое задание. Обычно такие задания требуют, чтоб например был файл input.txt. В этом файле в первой строке должно быть количество запускаемых процессов, а потом список программ для запуска.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines