gpt4 book ai didi

c - 处理 awk 命令时,'system' 为 'fork+execv'

转载 作者:行者123 更新时间:2023-11-30 14:20:50 25 4
gpt4 key购买 nike

1)解决问题后: How to translate 'system()' call to 'fork() + execl()' when dealing with awk command?

2)我按照melpomene的方法遇到了另一个问题:

#define LOG_FILE_PATH "/tmp/logfile"
system("awk -v FS=\"[][]\" -v BEGINTIME=\"$BEGINTIME\" -v ENDTIME=\"$ENDTIME\" '$2>=BEGINTIME && $2<=ENDTIME' "LOG_FILE_PATH);

它工作正常,我得到了我想要的。

3)翻译为fork+execl版本:

sprintf(tmp1, "BEGINTIME=%s", getenv("BEGINTIME"));
sprintf(tmp2, "ENDTIME=%s", getenv("ENDTIME"));
sprintf(tmp3, "$2>=%s && $2<=%s", getenv("BEGINTIME"), getenv("ENDTIME"));
execl("/usr/bin/awk", "awk", "-v", "FS=\"[][]\"", "-v", tmp1, "-v", tmp2, tmp3, LOG_FILE_PATH, (char *)0);

它什么也没输出,为什么?

最佳答案

因为 tmp 3 应包含文字文本 BEGINTIMEENDTIME。尝试:

sprintf( tmp3, "$2>=%s && $2<=%s", "BEGINTIME", "ENDTIME" );

此外,您可能希望在 tmp1tmp2 中保留双引号:

sprintf(tmp1, "BEGINTIME=\"%s\"", getenv("BEGINTIME"));

并且您确实需要检查环境变量是否实际设置。

此外,您对 FS 的设置不正确。在 system 版本中,awk 获取参数 FS=[][](shell 在调用 awk 之前去除双引号) 。)因此传递给 execl 的参数应该是 "FS=[][]"

关于c - 处理 awk 命令时,'system' 为 'fork+execv',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15088113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com