Как fork () два процесса одновременно

Я добился некоторого прогресса в своей программе, позволив запускать ее в течение произвольного числа времени от 0 до 20 с помощью rand ()% 20. Тем не менее, я не могу понять, как fork () от нескольких процессов, максимум 2.

Если я правильно понимаю fork (), я создал 1 родительский и 1 дочерний процесс в моей программе. Значение rand1 в

else if (pid==0) {
mypid = getpid();
cout << "Child pid is " << mypid << "\n";
execlp("./idle","./idle","1",rand1,0); }

в execlp создаст и запустит процессы ./idle для всего, что было сгенерировано, верно? Например, если rand1 == 19, каждый процесс, родительский и дочерний, будет работать в течение 19 секунд до завершения программы, не включая таймеры sleep () в коде.

Теперь моей главной проблемой является разветвление двух процессов, чтобы я не просто остался с одним родителем и одним ребенком, а с двумя родителями и двумя детьми, но выполняю программу, как она работает в настоящее время.

Я заблудился и, надеюсь, что некоторые указания могут прийти из будущих ответов этого поста.

Спасибо!

#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
#include <cstdlib>
#include <time.h>

using namespace std;
using std::cout;

volatile sig_atomic_t keep_going = 2;

void catch_child (int sig)
{ int status, p;
p = waitpid(-1,&status,WNOHANG);
if (p==0) return;
keep_going=0;
cout<<"Child process caught: "<< p <<endl;
return;
}

int  main()
{
pid_t pid;
pid_t mypid;

int rand1;
int i;

srand(time(NULL)); //init seed
rand1 = rand()%20; //generates random number 0 - 20

cout << "This is the random number (rand1): " << rand1 << "\n"; //output to see how long

signal (SIGCHLD, catch_child); //when child is sent, run function catch_child

pid = fork();
if (pid<0) {
cout<<"Error\n";
return 0;
}
else if (pid==0) {
mypid = getpid();
cout << "Child pid is " << mypid << "\n";
execlp("./idle","./idle","1",rand1,0);
} else {
mypid=getpid();

cout<<"Parent procss is " << mypid << " and child is " << pid << "\n";
sleep(3);

cout<<"Pausing child " << pid <<" for " << rand1 << "  seconds\n";kill(pid,SIGSTOP);

for (int i=0; i < rand1; i++) sleep(3);

cout<<"Resuming child "<<pid<<"\n";
kill(pid,SIGCONT);

cout<<"Parent process pid is "<<mypid<<" waiting for child to stop\n";
while (keep_going==rand1) sleep(2);

cout <<"Parent knows that Child now done\n";

}
return 0;

} //keep

ОБНОВИТЬ:

Вот пример запуска программы, которая выглядит как полу-рабочая. Прикрепленный код и изображение, относящиеся к примеру, запускаются с обновленным кодом ниже.

samplerun

#include <iostream>
#include <unistd.h>
#include <sys/wait.h>
#include <cstdlib>
#include <time.h>

using namespace std;
using std::cout;

volatile sig_atomic_t keep_going = 2;

void catch_child (int sig)
{ int status, p;
p = waitpid(-1,&status,WNOHANG);
if (p==0) return;
keep_going=0;
cout<<"Child process caught: "<< p <<endl;
return;
}

int  main()
{
pid_t pid;
pid_t mypid;

int rand1;
int i;

srand(time(NULL)); //init seed
rand1 = rand()%20; //generates random number 0 - 20

cout << "This is the random number (rand1): " << rand1 << "\n"; //output to see how long

signal (SIGCHLD, catch_child); //when child is sent, run function catch_child

;
for(int i=0;i<2;i++){
pid = fork();

if (pid<0) {
cout<<"Error\n";
return 0;
}
else if (pid==0) {
mypid = getpid();
cout << "Child pid is " << mypid << "\n";
execlp("./idle","./idle","1",rand1,0); //does rand1 make the processes run for rand1's value?
} else {
mypid=getpid();

cout<<"Parent procss is " << mypid << " and child is " << pid << "\n";
sleep(3);

cout<<"Pausing child " << pid <<" for " << rand1 << "  seconds\n";
kill(pid,SIGSTOP); //SIGSTOP acts as a PAUSE

for (int i=0; i < rand1; i++) sleep(3);

cout<<"Resuming child " << pid << "\n";
kill(pid,SIGCONT);

cout<<"Parent process pid is "<<mypid<<" waiting for child to stop\n";
while (keep_going==rand1) sleep(2);

cout <<"Parent knows that Child now done\n";

}
}
return 0;
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]