返すインタフェースなので、それに合わせるためです。子プロセスを生成します。pidには子プロセスの場合は0、親プロセスの場合は子プロセスのプロセスIDが返されます。子プロセスを新たなプロセスグループに移します。理由はあとでkillを呼ぶときに親プロセスまで巻き添えにしないようにするためです。子プロセスの標準出力を閉じ、パイプの書き込み用ファイルディスクリプタを代わりに使います。子プロセスの出力がパイプに書き込まれます。シェルを利用して引数に指定されたコマンドを実行します。シェルを利用する理由はpopenと同じ仕様(コマンド引数を1つの文字列で渡す)にしたいからです。シェルを挟まない場合は、複数の文字列に分割して渡す必要があります。子プロセスのプロセスグループを取得します。pidには子プロセスのプロセスIDが返されます。forkの部分も参照してください。子プロセスのプロセスグループを強制終了します。子プロセスが終了するまで待ちます。0;}そこそこ長いですね。簡単な解説コードを見ると目がチカチカする方向けにコメントだけ抜き出しました。動きが分かりやすいと思います。パイプに読み書きするファイルディスクリプタ(pipefd)2つが返されます。