c - 如何在 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
解决方案
这里可能是一个 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 将为此而战)。
推荐阅读
- amadeus - 为“授权标头中提供的访问令牌无效”获取 401
- php - 来自数组的数据,需要为未在任何行中列出的每个列选项提供消息(Codeigniter)
- c++ - C++ - 用另一个类的构造函数实例化一个对象
- xml - 使用 Bash 脚本从 XML 节点中提取字符串
- javascript - 年份 制作模型 Javascript HTML 链接到 URL
- c++ - 根据实例化点期望不同的类型
- c# - WPF:基于属性值的TextBox的ListBox中的颜色文本
- android - 发布新更新时清除应用数据和缓存
- html - 绝对定位打破了我的 css 轮播
- vba - 修复代码以正确附加扩展数字