【问题标题】:Why this Makefile execute the program infinite times?为什么这个 Makefile 会无限次执行程序?
【发布时间】:2020-05-27 19:19:37
【问题描述】:

make 文件必须编译并执行一个 c 程序 25 秒,然后必须向程序发送 SIGHUP 信号,但它会无限次执行。为什么?

生成文件代码:

test: all clean
    valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=$VALGRINDFILE ./supermercato &
    PROCESS_TO_KILL="$!"
    (sleep 25 && pkill -SIGHUP $PROCESS_TO_KILL)

全部:用于编译。

【问题讨论】:

  • 为什么这个标签是c
  • ...另外,为什么不会它可以多次运行?它不会创建任何 test 标记,因此 test 永远不会比构建输入更新,因此它永远不会“完成”/没有资格再次运行。
  • 顺便说一句,使用一行包含三个反引号的行(仅此而已)来开始和结束一个代码段。
  • 另一件事是,如果您使用续行来确保所有三个命令都在同一个 shell 实例中运行(或者只是取出换行符,以达到相同的效果,那么这段代码会更加健壮) )。如果PROCESS_TO_KILL="$!" 在与valgrind & 不同的shell 中运行,那么$! 当然不会在该shell 中填充。而pkill -SIGHUP $PROCESS_TO_KILL 也将无法看到该变量。
  • 坦率地说,如果你的目标是 GNU 系统,通过 timeout 命令运行 valgrind 会更容易,然后让 that 完成关闭工作下来。

标签: c linux makefile


【解决方案1】:

以下代码应该适合您(使用timeout):

test: all clean
    timeout 25 valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=$VALGRINDFILE ./supermercato

原始代码中的一些问题:

  1. Makefile 在单独的 shell 中运行目标的每一行。因此,您必须使用反斜杠“\”加入它们。
  2. 您应该在 shell 代码中转义 $,如下所示:$$PROCESS_TO_KILL, $$!
  3. pkill 不会被 PID 杀死,它会被模式杀死。需要使用kill

你的固定原码:

test: all clean
    valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --log-file=$VALGRINDFILE ./supermercato & \
    PROCESS_TO_KILL="$$!";\
    (sleep 25 && kill -HUP $$PROCESS_TO_KILL);  # You would need to check -SIGHUP or -HUP

【讨论】:

  • @Gianluca 太好了!那就别忘了接受我的回答
猜你喜欢
  • 1970-01-01
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
相关资源
最近更新 更多