在处理awk命令时如何将’system()’调用转换为’fork()+ execl()’?

1)以下系统调用正常:

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

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

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

我收到了错误消息:

 awk: cmd. line:1: Unexpected token 

那应该是这样的:

 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); 
Interesting Posts