A procedure is the higher level generalization of a subroutine with its own name, arguments and local scope. Procedures can be called which causes their encased code to be run, and possibly a result bound when the function returns.
int fib(n) {
if (n == 0 || n == 1) return n;
return fib(n-1) + fib(n-2);
}
Example of a procedure that returns the nth value of the Fibonacci sequence in C.
Procedures can be implemented using a call stack to store and retrieve required information about the procedure such as the return address and any arguments.