cプログラム内からawkまたはsedを呼び出すにはどうすればよいですか?
質問
cプログラム内でawkまたはsedを呼び出すにはどうすればよいですか?私はexec()を使用できることは知っていますが、fork()およびその他すべての厄介さを扱いたくありません。
解決
popen
は機能しますか?プロセスを生成し、FILE*
ハンドル
他のヒント
その後、選択はsystem()
であるか、プロセス生成をラップするライブラリを使用します。エラー、パイプなどを細かく制御したい場合は、後者、または回避したいハードコアの方法をお勧めします。
system()は簡単です。
ただし、可能であればこれを行わないようにしてください。スクリプトは、下ではなく上にあるときに最適に機能します。 UNIXを使用している場合は、多くの場合、作業を分割し、すべてのピースを呼び出すトップレベルのスクリプトを作成する方が適切です。
Bourneシェルを習得しなくても済むように、プログラマーがCコードに膨大な数のシステムコールを追加するのを見たことを覚えています。彼はそれが賢明で迅速な方法であると考えましたが、失敗したときはひどく失敗しました。彼は混乱をデバッグするために膨大な時間を無駄にしました。いくつかの単純なシェルコマンドを学習するだけではるかに高速になります...
ポール。
libc
には関数system
およびpopen
があり、これらは次のように機能します。
int system(cont char *command) {
const char *argv[4] = {"/bin/sh", "-c", command};
int status;
pid_t child = fork();
if (child == 0) {
execve(argv[0], argv, NULL);
exit(-1);
}
waitpid(child, &status, 0);
return status;
}
FILE *popen(const char *command, const char *type) {
int fds[2];
const char *argv[4] = {"/bin/sh", "-c", command};
pipe(fds);
if (fork() == 0) {
close(fds[0]);
dup2(type[0] == 'r' ? 0 : 1, fds[1]);
close(fds[1]);
execve(argv[0], argv, NULL);
exit(-1);
}
close(fds[1]);
return fdopen(fds[0], type);
}
(エラーチェックなどを除く)
引数の処理を(sh
を経由するのではなく)より細かく制御したい場合、または{stdin, stdout, stderr}
を複数制御したい場合は、自分で記述するか、ライブラリを見つける必要があります。しかし、標準ライブラリはほとんどのユースケースをカバーしています。
system()呼び出しで実行できますこのスレッドは良い例です