C 在不同提示下运行不同进程的Makefile
我正在创建一个Makefile,它运行一个C 在不同提示下运行不同进程的Makefile,c,linux,shell,makefile,prompt,C,Linux,Shell,Makefile,Prompt,我正在创建一个Makefile,它运行一个processmanager.c,并在第一个进程之后运行另一个进程supermarket.c。我想知道是否有可能为每个文件打开一个shell窗口,因为目前,我在同一个提示符中得到两个进程的输出,这让我很困惑 这是我的Makefile: all: manager supermarket manager: manager.c $(CC) $(CFLAGS) $(THREADS) -o manager manager.c supermar
processmanager.c
,并在第一个进程之后运行另一个进程supermarket.c
。我想知道是否有可能为每个文件打开一个shell窗口,因为目前,我在同一个提示符中得到两个进程的输出,这让我很困惑
这是我的Makefile:
all: manager supermarket
manager: manager.c
$(CC) $(CFLAGS) $(THREADS) -o manager manager.c
supermarket: supermarket.c
$(CC) $(CFLAGS) $(THREADS) -o supermarket supermarket.c
test2:
@echo [+] Starting Manager process...
@./manager & echo $$! > m.PID
@echo [+] Manager is running...
@echo [+] Starting Supermarket process...
@./supermarket 6 50 3 200 100 20 & echo $$! > sm.PID
@echo [+] Supermarket is running...
@sleep 25
if [ -e m.PID ]; then \
echo [+] Sending SIGHUP to Manager process...; \
kill -1 $$(cat m.PID) || true; \
echo [+] Manager waiting Supermarket to close...; \
while sleep 1; do ps -p $$(cat sm.PID) 1>/dev/null || break; done; \
fi;
@rm m.PID
@rm sm.PID
@echo
@echo
@./analisi.sh $(LOG_FN)
@echo
@echo
用
Makefile
运行单独的终端是相当有问题的,因为它与make
的一般流程没有很好的接口。更好的解决方案可能是让每个进程将其结果输出到日志文件,然后分别启动xterm
,或者在每个文件上运行tail-f
,以满足您的交互需求
all: manager supermarket
manager: manager.c
$(CC) $(CFLAGS) $(THREADS) -o manager manager.c
supermarket: supermarket.c
$(CC) $(CFLAGS) $(THREADS) -o supermarket supermarket.c
test2:
./manager >manager.log 2>&1 & \
echo $$! > m.PID
./supermarket 6 50 3 200 100 20 >supermarket.log 2>&1 & \
echo $$! > sm.PID
sleep 25
cat m.PID sm.PID | xargs kill -1
wait $$(cat m.PID sm.PID)
rm -f m.PID sm.PID
./analisi.sh $(LOG_FN)
实际上,不要将
Makefile
与@
混在一起(如果您不想看到发生了什么,可以使用make-s
运行它),这样可能会减少人类可读的状态更新量。您可以运行xterm-e
来启动运行
的xterm窗口Makefile中的shell命令折磨make
,并提供较少的控制。将shell命令放入一个单独的shell脚本中,只需调用该脚本即可。如果必须,可以执行以下操作:test2:./myscript
。至于单独的窗口,您可以执行(例如)xterm-e./supermarket 6 50 3 200 100 20
启动终端的具体命令取决于您的操作系统。传统上,X11提供了xterm
或其他同名命令,但这仍然不能很好地转化为MacOS,也不能很好地转化为不太幸运的大众平台。越来越多的不同的Linux桌面环境提供他们自己的gnome终端
或konsole
或诸如此类,非常感谢。但是在像你建议的那样调整makefile之后,我有两个问题。supermarket.log文件正确地包含了所有信息,同时manager.log文件有一些奇怪的字符,如“䥓䡇偕挠瑡档摥" 我也不知道为什么,在“等待”之后我得到了“错误127”“而且两个PID都没有被删除。我们不知道manager
应该打印什么;可能会发布一个单独的问题,并提供更多详细信息。kill
可能会立即终止进程,因此您可能无法成功地等待它们。你之前的代码看起来像是你希望他们在杀戮后留下来的。但这很容易解决;只需在wait
之前添加一个减号,即可忽略此命令的任何失败。