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

int global_var = 100; //Global variable (data segment)

int main(){
	int local_var = 50; // Stack callable
	pid_t pid = fork();

	if (pid < 0) {
		std::cerr << "Fork failed\n";
		return 1;
	}

	if (pid==0){
		// CHILD
		std::cout << "\n---CHILD---\n";
		std::cout << " Address of global_var: " << &global_var << "\n";
		std::cout << " Address of local_var:  " << &local_var << "\n";

		std::cout << "Before modification: global=" << global_var << ", local=" << local_var << "\n";

		// Trigger Copy-On-Write
		global_var = 200;
		local_var = 75;
		std::cout << "After modification: global=" << global_var << ", local=" << local_var << "\n";
		std::cout << "Child exiting...\n\n";
		return 0;
	}
	else {
		// PARENT
		wait(nullptr);
		std::cout << "\n---PARENT---\n";
		std::cout << " Address of global_var: " << &global_var << "\n";
		std::cout << " Address of local_var:  " << &local_var << "\n";
		std::cout << "Parent values after child modified its copy:\n";
		std::cout << " global=" << global_var << "\n";
		std::cout << " local=" << local_var << "\n";
		std::cout << "Parent exiting...\n";
	}
	return 0;

}
