#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

pid_t global_child_pid=-1;

void handle_sigint(int sig){
	printf("\n[SIGNAL HANDLER] Έλαβα το σήμα SIGINT (%d) - Ctrl+C πατήθηκε!\n",sig);
	printf("[SIGNAL HANDLER] Αντί να κλείσω αμέσως, το έπιασα για ομαλό τερματισμό.\n");
}

void handle_sigterm(int sig){
	printf("\n[SIGNAL HANDLER] Έλαβα το σήμα SITERM (%d).\n",sig);
	printf("[SIGNAL HANDLER] Καθαρίζω πόρους και τερματίζω...\n");
	exit(0);
}

void demo_simple_fork(){
	printf("\n--- 1. ΑΠΛΗ FORK ΚΑΙ PIDs ---\n");
	printf("Είμαι η αρχική διεργασία με PID: %d\n",getpid());
	pid_t pid=fork();
	if(pid<0){
		perror("Η fork απέτυχε!");
		return;
	}
	else if(pid==0){
		//Κωδικας Παιδιου
		printf("[CHILD] Γεια! Είμαι το παιδί.\n");
		printf("[CHILD] Το δικό μου PID είναι: %d\n",getpid());
		printf("[CHILD] Το PID του γονέα μου (PPID) είναι: %d\n",getppid());
		printf("[CHILD] Τερματίζω τώρα...\n");
		exit(0);
	}
	else{
		//Κωδικας Γονεα
		printf("[PARENT] Είμαι ο γονέας. Η fork επέστρεψε το PID του παίδιου: %d\n",pid);
		printf("[PARENT] Περιμένω να τελειώσει το παίδι...\n");
		wait(NULL);
		printf("[PARENT] Τα παίδι τερμάτισε. Συνεχίζω.\n");
	}
}

void demo_exit_status(){
	printf("\n--- 2. ΚΑΤΑΣΤΑΣΗ ΕΞΟΔΟΥ ΚΑΙ WAIT ---\n");
	pid_t pid=fork();
	if(pid<0){
		perror("Fork failed");
		return;
	}
	if(pid==0){
		printf("[CHILD] Κάνω δουλειά για 2 δευτερόλεπτα...\n");
		sleep(2);
		printf("[CHILD] Τελείωσα. Επιστρέφω τον μυστικό κωδικό '42'.\n");
		exit(42);
	} else{
		int status;
		printf("[PARENT] Περιμένω το παιδί (PID: %d)...\n",pid);
		pid_t child_pid=wait(&status);
		printf("[PARENT] Το παιδί με PID %d τελείωσε!\n",child_pid);
		if(WIFEXITED(status)){
			int child_value=WEXITSTATUS(status);
			printf("[PARENT] Το παιδί τερμάτισε κανονικά. Επιστρεφόμενη τιμή: &d\n",child_value);
		} else if(WIFSIGNALED(status)){
			printf("[PARENT] Προσοχή: Το παιδί τερματίστηκε από σήμα!\n");
		}
	}
}

void demo_zombie_process(){
	printf("\n--- 3. ΠΡΟΣΟΜΟΙΩΣΗ ZOMBIE ---\n");
	printf("Προσοχή: Σε λίγο, άνοιξε ένα άλλο τερματικό και γράψε 'ps aux grep Z'\n");
	pid_t pid=fork();
	if(pid==0){
		printf("[CHILD] Τερματίζω αμέσως")
	}
}

gvhghgfhfhhghgfhghgfhgfhgfghfgfhgfgfhgfgfhgfhgfhggghgvhgvhgvhgvhghgccghgchgchgcgchgchgchgcghcgcxfxgxgfxjmfxgfxgfxbvfdcvxcvxcvxcvxcvxcxcvxcvxcvxcvxcvxvxcvxcvdvfdfvdfvdfvfxvxzvxfxvzzxvcxvxcvcxcxxcvvxcvxcvxcvxxxcxcvxcv
