首页 > 解决方案 > 如何在 Linux 中自动停止 program.c 并输入命令?

问题描述

所以我有这个程序,它应该是 Linux 中的(超级基本)服务器,它向我显示这个菜单:

What u want to do?
 0 -> Exit
 1 -> Add product
 2 -> Show products list
 3 -> Turn on server

我想要它,这样当你输入数字 3 时,server.c 就会停止,就像你按下 CTRL + Z 并发送命令“bg”以便服务器在后台运行时一样(就像你执行命令“./ server&") 这样我就可以打开 client.c 并与服务器交互。

当您输入 3 时我希望它执行的操作示例(在这里我在 propmt 上手动执行):

estgv18708@viriato:~/tp6$ ./server

What u want to do?
 0 -> Exit
 1 -> Add product
 2 -> Show products list
 3 -> Turn on server
3

^Z
[1]+  Stopped                 ./server
estgv18708@viriato:~/tp6$ bg
[1]+ ./servidor &

提前致谢!:D

标签: clinuxunixserver

解决方案


这里可能是一个 XY 问题——你为什么要这样做?

基本问题是,这假定您的服务器程序是从 shell 运行的,并且您想返回 shell 来做一些事情。但是服务器在此期间会做什么呢?shell 将(需要)控制输入和输出,因此服务器几乎只需要等待。

你可以通过调用 kill 获得与 ^z 相同的效果:

kill(getpid(), SIGSTOP);

将让服务器向自身发送一个 STOP 信号。shell(它正在监视程序的进度)会注意到这一点并打印“已停止”消息,然后提示要做什么。服务器将停止,您可以使用 shell 的fg命令将其恢复(或使用 将其置于后台bg)。但是,如果您的服务器程序不是从 shell 运行(它只是直接在终端中运行),这只会停止服务器并且不会发生其他任何事情。

更常见的是,您要在这里运行一个子 shell:

system(getenv("SHELL"));

这将启动一个新的 shell 并等待它完成。当 shell 退出时(使用exit命令或在 shell 提示符下键入 ^d),服务器将恢复。

如果希望服务器在 shell 运行的同时继续运行,可以使用 fork+exec 在 child 中运行 shell,并在 parent 中继续运行服务器,也可以使用 fork+_exit 将服务器作为孙运行并让父 shell 继续,但您需要小心使用终端输入和输出(服务器和 shell 将为此而战)。


推荐阅读