【问题标题】:How to automatically stop a program.c and input a command in Linux?如何在 Linux 中自动停止 program.c 并输入命令?
【发布时间】:2021-04-14 11:50:00
【问题描述】:

所以我有这个程序,它应该是 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

【问题讨论】:

  • “停止”或暂停的程序与在后台运行的程序不同。要暂停程序,请发送 SIGSTOP(或 control+Z)。您可以使用 signal.h 中的 kill 函数向 pid 发送信号
  • 我想你想要的是创建一个守护进程,见stackoverflow.com/questions/17954432/creating-a-daemon-in-linux
  • 听起来你真正想要的是服务器程序独立运行,这样你就可以同时运行你的服务器和客户端。最好的方法是打开两个终端,这样每个会话都有自己的 TTY。否则你的 IO 将在两者之间打乱。您似乎也将暂停的程序与在后台运行的程序混淆了。后台程序本质上是在同一个 TTY 中分叉和执行的,而暂停的程序真正停止执行,直到它们收到恢复信号。
  • 正如@Geoffroy 提到的,你的服务器的生产使用应该通过一个守护进程来配置,但是你会在你的守护进程中丢失 IO,因此菜单并不是一个好主意。
  • 你仍然可以运行菜单然后只 fork 进入一个守护进程不是吗? @h0r53

标签: c linux unix server


【解决方案1】:

你不能只做 system("bg"); ? 你不需要停止程序只需要把它放在后台

【讨论】:

  • 不,我试过了,但没有用,但我想要一些类似的东西,因为我不想真正停止 server.c,我想让它在后台运行后自行运行输入“3”给程序。
  • 有人知道怎么做吗?
【解决方案2】:

这里可能是一个 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 将为此而战)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多