5

ac プログラム内で awk または sed を呼び出すにはどうすればよいですか? exec() を使用できることはわかっていますが、fork() やその他すべての厄介なことに対処したくありません。

4

5 に答える 5

7

うまくいくでしょうかpopenFILE*プロセスを生成し、ハンドルで読み書きします

于 2009-03-18T15:07:03.770 に答える
5

次に、選択system()するか、プロセスの生成をラップするライブラリを使用します。エラーやパイプなどを細かく制御したい場合は、後者、または回避したいハードコアな方法をお勧めします。

于 2009-03-18T15:07:02.990 に答える
3

system() は簡単です。

ただし、可能であれば、これを行わないようにする必要があります。スクリプトは、下ではなく上にあるときに最適に機能します。UNIX を使用している場合は、多くの場合、作業を分割して、すべての部分を呼び出す最上位のスクリプトを作成する方がはるかに優れています。

Bourne シェルを学ばなくて済むようにするために、C コードに膨大な数のシステム コールを追加するプログラマーを見たのを覚えています。彼は、それが巧妙で手っ取り早い方法だと考えましたが、失敗したときはひどく失敗しました。彼は混乱のデバッグに膨大な時間を費やしました。いくつかの簡単なシェルコマンドを習得する方がはるかに高速だったでしょう...

ポール。

于 2009-03-18T15:22:04.140 に答える
1

libc has functions system and popen, which work kinda like this:

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);
}

(except with more error checking and stuff)

If you want finer control over argument handling (instead of going through sh), or you want control over more than one of {stdin, stdout, stderr}, you'll have to write it yourself or find a library. But the standard library covers most use cases.

于 2009-03-18T15:22:32.110 に答える
1

system() 呼び出しを介してそれを行うことができますこのスレッドは良い例です

于 2009-03-18T15:30:45.397 に答える