I keep getting
implicit declaration of function \'execle\' is invalid in C99
when compiling the code below. What am I missing?
I got it working. That's the order the statements should be as it turns out. Anything after execle won't run.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
  char *my_env[] = {"JUICE=PEACH and apple", NULL};
int main (int argc, char *argv[]) 
{
  printf ("Diners: %s\n", argv[1]);
  printf ("Juice: %s\n", getenv("JUICE"));
  execle ("diner_info", "diner_info", "4", NULL, my_env);
  return 0;
}
Result:
# :$ gcc diner_info.c -o diner_info && ./diner_info 
Diners: (null)
Juice: (null)
Diners: 4
Juice: PEACH and apple
Diners: 4
Juice: PEACH and apple
Diners: 4
Juice: PEACH and apple
Diners: 4
Juice: PEACH and apple
Diners: 4
Juice: PEACH and apple
Diners: 4
Juice: PEACH and apple
But I still don't understand why the null values on the top, though.
I think you might have this all wrong and just in case someone else is running into this problem I'm submitting this. I'm also reading the head first c book as well and came across this section. I think you need two programs one should be named "dinner_info"
//dinner_info.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
    printf("Dinners: %s\n", argv[1]);
    printf("Juice: %s\n",getenv("JUICE"));
    return 0;
}
and the other should be your driver program say my_exec_program where you need to include the header unistd.h as you will be calling the execle function
//my_exec_program
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main (int argc, char* argv[])
{
    char * my_env[] = {"JUICE=peach and apple", NULL};
    execle("dinner_info", "dinner_info", "4" , NULL , my_env);
}
pay special attention to how you set the JUICE environment variable there should be no spaces between JUICE, equal sign and peach. I kept getting null values for JUICE because of this omission.
So what is happening here, You're calling a program that calls another program and passing in an environment variable to the called program using the function execle.
In C99, the implicit declaration of a function is not allowed. That means, the compiler should be aware of the function signature before it encounters a call to that function. This can be achieved two ways:  
Usually, the function signature is provided as a forward declaration through the header files.
As per the man page of execle(), you need to include unistd.h to get the forward declaration.
You need to include unistd.h to resolve the implicit dec warning