0

1)次のシステムコールは正常に機能します。

#define LOG_FILE_PATH "/tmp/logfile"
system("awk -v PRI=\"$PRI\" '/^<'$PRI'>/' "LOG_FILE_PATH);

2)しかし、上記のシステムを置き換えるためにfork + executeを使用する場合:

pid = fork();
if (pid == 0) {
    execl("/usr/bin/awk", "awk", "-v", "PRI=\"$PRI\"", "'/^<'$PRI'>/'", LOG_FILE_PATH, (char *)0);
} else {
    /* parent */
}

エラーメッセージが表示されました:

awk: cmd. line:1: Unexpected token
4

1 に答える 1

1

これは次のようになります。

execl("/usr/bin/awk", "awk", "-v", "PRI=???", "/^<???>/", LOG_FILE_PATH, (char *)0);

コマンドの引用符system()はシェルによって処理されます。それらはawkに渡されません。ここで直接awkを呼び出しているので、引用符を省略する必要があります。

それは2番目の問題につながります:シェルはのような環境変数を拡張する責任があります$PRI。これは手動で行う必要があります。おそらく次のようになります。

char tmp1[123], tmp2[123];
snprintf(tmp1, sizeof tmp1, "PRI=%s", getenv("PRI"));
snprintf(tmp2, sizeof tmp2, "/^<%s>/", getenv("PRI"));
execl("/usr/bin/awk", "awk", "-v", tmp1, tmp2, LOG_FILE_PATH, (char *)0);
于 2013-02-26T07:19:35.673 に答える