Необходимо реализовать функцию запуска и параллельного выполнения нескольких программ. Задаётся количество выполняемых программ и набор их имён(пути к исполняемым образам). Исходный процесс завершается сразу после их порождения.
Написать тестовую программу для проверки работоспособности разработанной функции.
Как сделать так, чтобы исходный процесс завершается сразу после их порождения? И какие здесь есть косяки, что ещё надо сделать?
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;
}
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::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.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;
}