0

1)以下系统调用工作正常:

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

2)但是如果我用fork+execl来替换上面的系统:

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()由 shell 处理;它们没有传递给 awk。当您在这里直接调用 awk 时,您需要省略引号。

这导致了第二个问题:shell 负责扩展环境变量,例如$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 回答