As written, the dining philosophers solution suffers deadlock only rarely, because the delay between getting the two forks is generally very small, and unlikely to be interleaved with messages from other processes. Thus, the two forks act much like a single resource. Experiment and see if you can induce deadlock reliably. Verify that each philosopher needs a resource held by another philosopher. A benefit of inducing deadlock reliably is that by being able to force deadlock to occur, you can tell when you've fixed it properly.
Deadlock also proves that mutual exclusion is occurring on the forks.
Now that you have deadlock reliably induced, see if you can fix it. One way is to attack the cycle of dependency each philosopher has with the next. Modify the code and test. Make copies of the changed files philosopher.c and philosopher before going on to the next part. Another way to fix deadlock is to insist that both forks are taken together.