// parent.c: the parent program
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <iostream>
#include <sys/wait.h>
void fork_wait()
{
int status, ret;
int pid;
pid = fork ();
if (pid == 0)
{
// I am the child
printf ("Child: Work completed!\n");
printf ("Child: Bye now.\n");
printf("child process, pid = %u\n",getpid());
// Here It will return Parent of child Process means Parent process it self
printf("parent of child process, pid = %u\n",getppid());
sleep(20);
exit (0);
}
// I am the parent
printf ("Parent: Waiting for Child to complete.\n");
if ((ret = waitpid (pid, &status, 0)) == -1)
printf ("parent:error\n");
}
int main (int argc, char **argv)
{
int i = 0;
long sum;
printf ("Parent: Hello, World!\n");
while(1)
{
fork_wait();
i++ ;
std::cout<<"i="<<i<<"\n";
sleep(2);
}
}
// memory check
#include <mutex>
#include <atomic>
#include <chrono>
#include <thread>
std::atomic<int> number(0);
std::atomic<int> number_last(-1);
int ThreadMemCheck(double memory_usage_threshold, int memory_check_interval_in_minutes)
{
while (true)
{
int num = number;
number_last = num;
std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 60 * memory_check_interval_in_minutes));
//std::cout << "number_last = " << number_last << "\n";
//std::cout << "number = " << number << "\n";
//double usage = (double)GetMemoryUsage();
//std::cout << "usage:" << usage << "\n";
//std::cout << "memory_usage_threshold:" << memory_usage_threshold << "\n";
if (number_last == number && number > 10)
{
double usage = (double)GetMemoryUsage();
if (usage > memory_usage_threshold || usage < 0)
{
LOG_WARN("Now exit child process to free memory usage:" << usage << " number="<< number);
_exit(0);
}
}
}
}
std::thread t1(ThreadMemCheck, config_.memory_usage_threshold, config_.memory_check_interval_in_minutes);
t1.detach();
g++ -o fork fork.cpp