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
答案 0 :(得分: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);