argv[0]に入っているのは「プログラム名」では無く、「実行時のコマンド名」です。
たとえば、vi,ex,view,veditは同じ実行ファイルにリンクされたファイル名です。
vi,ex,vedit,viewどのコマンドを実行しても起動する実行ファイルは同じモノです。
そして、argv[0]には実行時にしたコマンド名が格納されます。
viエディタの場合、argv[0]を「起動モードの指定」に流用しているため、viならフルスクリーンモード、exならラインモード,viewなら読取専用フルスクリーンモードで起動します。
ハードリンクの場合、実行ファイルの実名と言うものは存在しないため、argv[0]で示されるファイル名をそのままプログラム名と認識しても良いと思います。
問題はシンボリックシンクのときで、シンボリックリンクは「ファイルの別名」に過ぎないため、「正確なプログラムファイル名」を取得したいのなら
1.argv[0]を元にファイル情報を取得
2.シンボリックリンクであることを確認
3.リンク先ファイル名の取得
という手順を踏む必要があります。
「psコマンドをpopen()で起動してpidでスキャンする」という方法もあります。
こちらの場合だと、シンボリックリンクの場合でもリンク先ファイル名が得られます。
最後に、/dev/kmemをスキャンすることでほとんどのunixで動作するプログラムが作れるはずです。
要するに、旧バージョンのpsと同じことをすればよいのです。