Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在不同提示下运行不同进程的Makefile_C_Linux_Shell_Makefile_Prompt - Fatal编程技术网

C 在不同提示下运行不同进程的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

我正在创建一个Makefile,它运行一个
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
之前添加一个减号,即可忽略此命令的任何失败。