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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> управление процессами 
:(
    Опции темы
An123
Дата 8.11.2009, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Необходимо реализовать функцию запуска и параллельного выполнения нескольких программ. Задаётся количество выполняемых программ и  набор их имён(пути к исполняемым образам). Исходный процесс завершается сразу после их порождения.
 Написать тестовую программу для проверки работоспособности разработанной функции.
 
Код

#include <unistd.h>
#include <signal.h>
#include <iostream>
#include <cstdlib>

using namespace std;
void children()//остальные процессы
{
 while(1) pause();//вечно ждать
}
void childrenB()//процесс В
{
pid_t pid;
  pid=fork();//создание процесса Е
  switch(pid){//обработка
   case -1: cout<<"fork error"<<endl; exit(-1);
   case 0: children(); break;
 }
 while(1) pause();//вечно ждать
}

void childrenC()//процесс С
{
pid_t pid;
 for(int i=0;i<2;i++){//создание процессов F G
  pid=fork();
  switch(pid){//обработка
   case -1: cout<<"fork error"<<endl; exit(-1);
   case 0: children(); break;
 }
}
 while(1) pause();//вечно ждать
}

int main(int argc, char *argv[])
{
 pid_t pid;
 for(int i=0;i<3;i++){//создание процессов BCD
  pid=fork();
  switch(pid){
   case -1: cout<<"fork error"<<endl; exit(-1);
   case 0: if(i==0) childrenB();//В
       if(i==1) childrenC();//С
       if(i==2) children();//D
       break;}
 }
sleep(5);//даем время на обрботку
 return 0;
}

Как мне здесь задать количество выполняемых программ и  набор их имён?
И вообще как должна выглядеть тестовая программа для проверки работоспособности разработанной функции?  smile 
PM MAIL   Вверх
ZeeLax
Дата 8.11.2009, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 4388
Регистрация: 20.8.2006
Где: Алма-Ата

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



Нашли решебник контрольных/курсовых?


--------------------
Utility is when you have one telephone, luxury is when you have two, opulence is when you have three — and paradise is when you have none.
— Doug Larson
PM MAIL WWW ICQ Skype Jabber   Вверх
nickless
Дата 9.11.2009, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

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



Цитата(An123 @  8.11.2009,  15:56 Найти цитируемый пост)
Как мне здесь задать количество выполняемых программ и  набор их имён?

Имена и количество можно взять например из argv, a для их запуска вместо fork курить man execv.

Конкретные вопросы есть? Если нужно готовое решение, то это уже в "Центр помощи"...


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
An123
  Дата 15.11.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



то есть как я понимаю надо использовать это :
Код

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
 
#define NPROC 2        /* количество процессов */
 
void fnc(char *);
 
int
main(void)
{
    pid_t pids[NPROC];
    int 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 */
        }
    }
 
    /* ждем завершения дочерних процессов */
    for(i = 0; i < NPROC; i++)
        waitpid(pids[i], NULL, 0);
    
    return 0;
}
 
void
fnc(char *file)
{
    execl("/bin/ls", "ls", NULL);
 
    /* сюда попадем только в случае ошибки */
    abort();


?
что здесь ещё надо сделать?
PM MAIL   Вверх
nickless
Дата 15.11.2009, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

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



Ладно, для начала переношу в программирование.

Модератор: Тема перенесена из "*NIX системы: Общие вопросы"


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
nickless
Дата 15.11.2009, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

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



Код вроде делает что должен.

Цитата(An123 @  15.11.2009,  16:24 Найти цитируемый пост)
что здесь ещё надо сделать? 

Думаю неплохо было бы использовать параметр функции fnc, ну и брать имена программ из argv smile 

И вот это тут не происходит:
Цитата(An123 @  8.11.2009,  15:56 Найти цитируемый пост)
Исходный процесс завершается сразу после их порождения.

Цитата(An123 @  15.11.2009,  16:24 Найти цитируемый пост)
/* ждем завершения дочерних процессов */




--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
An123
Дата 21.11.2009, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сейчас исходный процесс завершается сразу после их порождения?
Код

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
 
#define NPROC 2        /* количество процессов */
 
void fnc(char *);
 
int
main(void)
{
    pid_t pids[NPROC];
    int 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 */
        }
    }
 

 
void
fnc(char *file)
{
    execl("/bin/ls", "ls", NULL);
 
    /* сюда попадем только в случае ошибки */
    abort();


А зачем здесь использовать параметр функции fnc и брать имена программ из argv 
здесь же есть - #define NPROC 2        /* количество процессов */ и  execl("/bin/ls", "ls", NULL);
PM MAIL   Вверх
GwinnBleidd
Дата 21.11.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 2.5.2008
Где: Украина, Донецк

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



Цитата(An123 @  21.11.2009,  16:23 Найти цитируемый пост)
Сейчас исходный процесс завершается сразу после их порождения?

да, теперь будет завершаться сразу после порождения.

Цитата(An123 @  21.11.2009,  16:23 Найти цитируемый пост)
А зачем здесь использовать параметр функции fnc 

а зачем у вас описан параметр функции?  smile 

Цитата(An123 @  21.11.2009,  16:23 Найти цитируемый пост)
и брать имена программ из argv 

я так понимаю, вам нужно как-то задавть набор имен программ. В вашем же текущем коде для каждого порожденного процесса всегда выполняется ls (при чем не потому что вы делаете fnc("ls"),
а потому что у вас жестко прописано  execl("/bin/ls", "ls", NULL) )

PM MAIL   Вверх
An123
Дата 30.11.2009, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

#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] и т.д.)

У меня никак не получается этот кусок! 
PM MAIL   Вверх
Anark1
Дата 4.12.2009, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

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



An123, приведенный код не соответствует тому, что вы пишите.

Цитата

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


В argv начиная с 1 и до n хранятся параметры к оторыми была вызвана программа, в argv[0] имя программы, argc - количество параметров.

Код

 for(i = 0; i < argc; i++) 


Цитата

У меня никак не получается этот кусок!  


А то что есть не работает? 


--------------------
Enjoy yourself, still you can...;)

user posted image

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

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

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


 




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


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

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