управление процессами

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
WARPIG79
Сообщения: 2
Зарегистрирован: 05 дек 2009, 11:37

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

Как сделать так, чтобы исходный процесс завершается сразу после их порождения? И какие здесь есть косяки, что ещё надо сделать?

Код: Выделить всё

#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;
}
process.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: :o perator bool() const
{
    return pid != 0;
}
inline pid_t Process::id() const
{
    return pid;
}
void f(int n, std::vector <std::string> v);
#endif
process.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]);
}
while (n!=0)
{
if(wait(NULL)!=-1)
--n;
}
return;
}
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

Замени EXIT_SUCCESS на 0. Это макрос и он всё равно меняется на 0.
Если ты пишешь реализация в хидере, она и так будет inline.
Без знания, что делают fork() и getpid() нельзя понять, что делает run.
Exit() предназначена для аварийного завершения программы и всех её процессов, так что тебе надо что-то другое.
Посмотри WinExec(). Он не ждёт завершения вызываемого процесса. Вот тебе ссылка, почитай http://www.cyberguru.ru/cpp-sources/dll ... nexec.html
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
WARPIG79
Сообщения: 2
Зарегистрирован: 05 дек 2009, 11:37

Airhand, пишу в KDevelop.
Как сделать так, чтобы исходный процесс завершается сразу после их порождения?
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

KDevelop мне ни о чём не говорит.
WinExec не ждёт завершения порождённого процесса. В CreateProcess() можно настроить, чтоб ждал. Выбирай.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

&quot писал(а):Без знания, что делают fork() и getpid() нельзя понять, что делает run.
fork - порождает child thread.
getpid - возвращает process id (PID) - уникальный идентификатор процесса в юникc подобных системах.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Airhand
Сообщения: 239
Зарегистрирован: 06 окт 2005, 16:21
Откуда: Dnepropetrovsk

CreateProcess - это winapi-шная функция, а WinExec вообще реализована как вызов первой. Так что сюда они не годятся. Под "юникc подобные системы" нужно что-то другое. У меня совсем нет опыта программирования под "юникc подобные системы". Я не знаю.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union
Ответить