「ls を読まずにプログラマを名乗るな!」って本があります。2013年出版の本でKindle 版が出ています。私がこの本をC言語の本として進めます。
下手な入門書を読むより、ずっと良いと思います。GNU のCoreUtls の中にあるls.c
というls のソースを読むわけです。なぜ良いとかというと、ほぼいろんな環境で可能だからです。WindowsのUbuntuであろうが、raspberry pi でUbuntu であろうが 普通のUbuntu であろうが、勉強できます。要はgcc, make, gdb あたりをapt でインストールしたら、じっさいCoreUtils のファイルをとってきて ./confiure, make CFLAGS='-g' でデバッガーgdb 使いながらソースを走らせてみることもできます。ただし何分2013年の本ですから この本で触れてあるls のソースのヴァージョンはCoreUtils 8.21 のものでこれは中のソースのライブラリーかGlibが新しくなってるためかコンパイルはできません。しかしCoreUtils 9.0という最新のものはコンパイルできます。ls.cも diff で比較したらかなり変わってますが、書いてる部分についてはソースは変わりないようです。
なぜ、これがいいか? 今の人たちは CUIをあまり使わないので、その良さを知りません。ls を使ってないでしょうね。このコマンドがいかに便利か、そしてそれを実現をCでどうやってるのか、この本は解説しています。
またコンパイル自体もls.cだけでなくいろんなものをコンパイルしてるわけで、そのmake や Makefile また ./configure という、GNUのautomake 環境など本当の実装を見られます。
あとソースを読むのに、いろんなツール、エディターつまりemacs やvim またはless を使うし、grepも使うはずです。前述のdiff もそうです。これらはほかの言語を勉強する際にも役立つ環境です。
本を見てて思うのは、ソースのどの部分を見ないで、捨てるかつまりどこを捨ててどこをちゃんと見るか、これを学ぶことになると思います。大半はエラー処理です。だからそこは飛ばして、やっていることを取り出す。しかしC言語の場合、すべてやらないといけない。変数にメモリーを割り当てる部分や構造体を自前で作らないといけない。これらはOOPな他の言語ではそういうパーツがすでにあってそれを使えば、勝手にやってくれる。そこを全部、自分でやっている。だかた今の言語で読み替えて、それでどんな作業をやってるか見る作業が必要になってくる。そのために捨て去る部分がかなりある。結局はそのメリハリをつけることの重要性を学ぶことになると思う。
ほかのCのソースと違ってls はla.c の一つのファイルをよめばよい。その意味ではほかのプログラムでみるCのソースは、何十個もソースファイルが分かれてるので、どのファイルか探すだけでも骨が折れる。これはそれはない。
私自身も進行形のお勧めの勉強法です。
もちろん OOPや関数型言語の勉強は必須です。しかしC言語を学ぶ意味は上に書いたようなことだと思う。