C言語でmanコマンドを書きたい

■要求定義
– コマンドのマニュアルを表示する

$ man 調べる語句

/usr/share/man 直下にソースコードがある
man1 ユーザプログラム
man2 システム呼び出し
man3 ライブラリ呼び出し
man4 特殊ファイル
man5 ファイルフォーマット
man6 ゲーム
man7 その他
man8 システム管理者

e.g.
/usr/share/man/man1/ln.1.gz を解凍する

.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.47.3.
.TH LN "1" "January 2018" "GNU coreutils 8.28" "User Commands"
.SH NAME
ln \- make links between files
.SH SYNOPSIS
.B ln
[\fI\,OPTION\/\fR]... [\fI\,-T\/\fR] \fI\,TARGET LINK_NAME   (1st form)\/\fR
.br
.B ln
[\fI\,OPTION\/\fR]... \fI\,TARGET                  (2nd form)\/\fR
.br
.B ln
[\fI\,OPTION\/\fR]... \fI\,TARGET\/\fR... \fI\,DIRECTORY     (3rd form)\/\fR
.br
.B ln
[\fI\,OPTION\/\fR]... \fI\,-t DIRECTORY TARGET\/\fR...  \fI\,(4th form)\/\fR
.SH DESCRIPTION
.\" Add any additional description here
.PP
In the 1st form, create a link to TARGET with the name LINK_NAME.
// 省略

$ man ln
make links between files と書かれているのがわかります。

■検討
– gzファイルを配置して、解凍して中身を読み取るプログラムを書いていく
$ ls -l
total 20
-rwxrwxr-x 1 vagrant vagrant 8344 May 18 08:34 dev
-rw-rw-r– 1 vagrant vagrant 267 May 18 08:34 hello.c
-rw-rw-r– 1 vagrant vagrant 1728 May 18 10:53 ln.1.gz

#include <stdio.h>
#include <stdlib.h>

int main(){

	char cmd[256];
	char str[256];
	char filename[] = "./ln.1.gz"; //  /usr/share/man/man1/ln.1.gz

	sprintf(cmd, "gzip -d %s", filename); // gzip -d(ファイル展開)が指す書式文字列に従って cmdが指す文字配列へ書き込み
	
	FILE *fp;
	fp = popen(cmd, "r"); // popenはプロセスをオープンする
	while(fgets(str, 256, fp)){
		printf("%s", str);
	}
	pclose(fp);

	return 0;
}

zipオープンまではいくが、fgetsの出力がうまくいかんな。