0

私はC初心者です。私の最終的な目標は、Apache ユーザー アカウントの crontab を JSON として返す Apache モジュールを作成することです。

しかし、赤ちゃんは最初に歩きます。次の 2 つの場所にあるチュートリアルに従って、Apache モジュールから "hello world" とそのバリエーションを出力することに成功しました (実際、Nick Kew の本を所有しています)。

次のように JSON を出力するように例を少し変更しました。

ap_rputs("{'hello': {'to': 'world', 'from': '?'}}", r);

「?」を置き換えたいのですが。上記は、Linux システムの「whoami」コマンドからの出力です (最終的には、Linux コマンド「crontab -lu username」を実行したいと思います)。C の初心者として、私はこれをどのように行うかについての選択肢に圧倒されていますが、いくつかのことを試しましたが、何かが正しくなるにはほど遠いようです。私はwhoamiからの出力をトラップできるようです、または少なくとも私のコードはコンパイルして実行されます;)

FILE *sysp = popen("whoami","r");

しかし、私は上記の権利を行っていますか?そして、良い次のステップは何ですか?上記から出力の長さを判断してから、同じ長さの char 配列を作成し、ファイル ハンドルを巻き戻して、出力を取得しようと考えました。しかし、私は長さを適切に取得していないようです。おそらくこれは次善のアプローチですか? 次のコマンドを実行すると (rewind、fclose など、必要な行がいくつか省略されています)、得られる出力は -1 です。

fseek(sysp, 0L, SEEK_END);
long len = ftell(sysp);
char buf[2];
sprintf(buf, "%d", (int)len);
ap_rputs(buf, r);

システムコマンド「whoami」からの結果を出力するためのより良いアプローチ方法に関する具体的な指針をいただければ幸いです。

4

1 に答える 1

1

このFILE *場合の は、実際にはシークできない可能性があるパイプを指します。理想的には、外部プログラムを呼び出すのではなく、探している情報をシステムから直接取得する必要があります。getuid()ここではandgetpwent()関数が役立つと思います。

As getpwent()may block (メソッドを使用するpopen()のと同じように、リクエストごとに少なくとも 1 つのスレッドを使用しない MPM でモジュールを使用するのは安全ではありません。

于 2011-01-27T12:17:06.447 に答える