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

Поиск:

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


Новичок



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

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



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

вот что получилось:
main.cpp
Код

#include <iostream>
#include <vector>
#include <unistd.h>
#include <string>
#include <process.h>

using namespace std;

int main(int argc, char *argv[])
{

    cout << "Vvedite kollichestvo programm:"<<endl;
    unsigned n;
    cin>>n;
    std::vector <string> v;
    v.resize(n);
    if(n<=0) return 0;
    cout << "Vvedite imena programm:"<<endl;
    for (int i =0; i<n; ++i)
    {
        cin>>v[i];
    }

f(n,v);
cout<<"end"<<endl;
    return EXIT_SUCCESS;
}


proc.h

Код

#ifndef PROCESS_H
#define PROCESS_H
#include<unistd.h>
#include<iostream>
#include <vector>
#include<string>
class Process
{
public:
    Process();
    ~Process() {}
    operator bool() const; 
    pid_t id() const;
    bool run(std::string a);
    
protected:
    int action(std::string a);
private:
    Process(pid_t id);
private:
    pid_t pid; 
};
inline Process::operator bool() const
{
    return pid != 0;
}
inline pid_t Process::id() const
{
    return pid;
}
void f(int n, std::vector <std::string> v);
#endif


proc.cpp

Код

#include "process.h"
#include <cstdlib>
#include <string>
#include <vector>
#include <signal.h>
#include <sys/wait.h>
using namespace std;

Process::Process()
        : pid(0)
{
}
Process::Process(pid_t id)
        : pid(id)
{
}
bool Process::run(std::string a)
{
    if ( pid )
        return false;
    pid = fork();
    switch ( pid )
    {
    case -1:
        pid = 0;
        return false;
    case 0:
        pid = getpid();
        exit(action(a));
    }
    return true;
}

int Process::action(string a)
{
system(a.c_str());
return 0;
}

void f(int n, vector <string> v)
{
vector <Process> p(n);
for(int i=0; i<n;++i)
{
p[i].run(v[i]);
}
return;
}


Всё работает
Но значительную часть этого  взял из методички - вроде понимаю что здесь происходит - но препод придирается
Не могли бы рассписать - что здесь к чему?
Особенно интересуют это :
Код

class Process
{
public:
    Process();
    ~Process() {}
    operator bool() const; 
    pid_t id() const;
    bool run(std::string a);
    
protected:
    int action(std::string a);
private:
    Process(pid_t id);
private:
    pid_t pid; 
};
inline Process::operator bool() const
{
    return pid != 0;
}
inline pid_t Process::id() const
{
    return pid;
}
void f(int n, std::vector <std::string> v);
#endif

 и 
Код

Process::Process()
        : pid(0)
{
}
Process::Process(pid_t id)
        : pid(id)
{
}
..................
void f(int n, vector <string> v)
{
vector <Process> p(n);
for(int i=0; i<n;++i)
{
p[i].run(v[i]);
}


PM MAIL   Вверх
comcon1
Дата 16.1.2010, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



Ты знаешь, что такое fork?

вот нек. пояснения:

==========
Process::Process() -- конструктор
        : pid(0)  -- инициализация переменной класса pid
{
}
Process::Process(pid_t id)
        : pid(id)
{
}
..................
void f(int n, vector <string> v)
{
vector <Process> p(n); -- создание STL-массива из n процессов
for(int i=0; i<n;++i)
{
p[i].run(v[i]);
}

inline Process::operator bool() const -- вот это перегрузка оператора приведения типа Process к типу bool
============

Что тебе именно не понятно, ты не написал.

Еще я не понимаю, почему ты используешь system, а не exec.


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


Новичок



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

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



А вот здесь 
Код

int Process::action(string a)
{
system(a.c_str());
return 0;
}

a.c_str() - это преобразование из string в char?
PM MAIL   Вверх
andrew_121
Дата 16.1.2010, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата

man function_name

и гугл. все вопросы пропадут.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
An123
Дата 16.1.2010, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ну а всё таки?
PM MAIL   Вверх
bsa
Дата 17.1.2010, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



An123, на подобные вопросы отвечает google (вторая ссылка) и документация.
PM   Вверх
comcon1
Дата 17.1.2010, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



c_str - да string в char*.
Повторяю вопрос:
Ты знаешь, что такое fork?

У меня есть стойкое подозрение, что нет.


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


Новичок



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

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



comcon1, знаю.
ну я уже разобрался 
спасибо за помошь.
PM MAIL   Вверх
bsa
Дата 18.1.2010, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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




M
bsa
An123, если ответ на вопрос получен, то пометь тему решенной

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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