>>1
1) Start off with any generic "C for n00bs" book, I didn't like "Learn C in 24 hours", others here probably do, though.
2) Once you're comfortable with that, get "Beginning Linux Programming" by Richard Stones and Neil Matthew
3) Read real code, modify shit and run it. Do NOT use GNU code; the GNU coding standards are made of lose and fail. An alternative might be to grab some simple BSD programs, modify and compile them (eg run "apt-get source pmake" or "apt-get source nvi" if you're using debian).
Consider getting VMPlayer and/or Qemu and installing FreeBSD on a virtual machine; that way you can install the source for the whole OS in one place and then poke around, modifying crap, breaking it, and fixing it.
With FreeBSD you get a whole shitload of code for the entire OS (wide variety to choose from) which has been tested to compile and interoperate with each other (no weird surprises from gnu-foo.tar.gz conflicting with gnu-bar.tar.gz) so you can focus on just fucking with stuff.