$ls ascii-table avg.txt case-changer.c env-var-set functions_ver1 mph-to-kph.c ascii-table.c avg-with-garbage.txt env-var env-var-set.c functions_ver1.c mph-to-kph_v2.c ascii-table.md case-changer env-var.c exist.sh functions_ver2.c output.c $zile functions_ver2.c $gcc functions_ver2.c -o functions_ver2 $./functions_ver2 Inside main Calling function one Inside function one Calling function two Inside function two Returning with (error) from function two $cat functions_ver2.c #include <stdio.h> #include <stdlib.h> int func1(void); int func2(void); int main(int argc, char *argv[]) { printf("Inside main\n"); printf("Calling function one\n"); if (func1()) { printf("Everything ok from function one\n"); printf("Return with 0 from main - all ok\n"); return 0; } else { printf("Caught an error from funtcion one\n"); printf("Return with 1 from main - error\n"); return 1; } return 0; /* We shouldn't reach this, but just in case */ } int func1(void) { printf("Inside function one\n"); printf("Calling function two\n"); if (func2()) { printf("Everything ok from function two\n"); exit(0); } else { printf("Caught an error from function two\n"); exit(1); } } int func2(void) { printf("Inside function two\n"); printf("Returning with (error) from " "function two\n"); exit(1); } $