1
Cbdy 2016-10-22 12:18:21 +08:00 via Android 1
进程间通信?
|
2
tongpeng1995 OP @Cbdy 你的意思是,主进程创建一个子进程在后台跑,然后主进程监听键盘输入并且用进程间通讯跟子进程沟通么?
但是我要怎么做成跟 nginx 一样,任意一个终端登录上去,都可以给子进程发送消息? |
3
DoraJDJ 2016-10-22 12:34:04 +08:00 via Android 1
|
4
clino 2016-10-22 12:35:07 +08:00 1
http://supervisord.org/ 这个是很常用的
|
5
sherlocktheplant 2016-10-22 12:35:41 +08:00 1
可以用信号量
|
6
jasontse 2016-10-22 12:45:40 +08:00 via iPad 1
> 我写了一个程序,在后台一直跑。
http://alfred-sun.github.io/blog/2015/06/18/daemon-implementation/ > 在终端输入 nginx reload 可以让 nginx 重新载入配置文件。 nginx reload 等同于向 nginx master 进程发出 SIGHUP 信号 http://hutaow.com/blog/2013/10/19/linux-signal/ |
7
hosiet 2016-10-22 12:46:52 +08:00 via Android 1
可以服务程序长时间监听一个 socket ,控制程序在需要的时候发信息就行。简单需求可以考虑信号,还有管道之类的各种做法,说到底都属于进程间通信的范畴。
对了,部署环境允许的话还可以考虑 dbus 那一套。 |
8
Vicer 2016-10-22 12:50:07 +08:00 via Android 1
我呢,是这么做到的,写个.sh 放在链接到 /usr/local/bin 里面,然后,就可以这样操作了。
|
9
catror 2016-10-22 12:50:59 +08:00 via Android 1
进程通信,可以用命名管道或者域套接字。比如用域套接字,你的后台进程监听这个域套接字,考虑到你还要实现 reload 之类的操作,在主线程监听吧。然后你输入的控制台命令,封装成消息,通过域套接字发送给后台进程,后台进程接收命令消息并处理,然后返回结果,通信的消息结构自己定义就好了。
|
10
yangyaofei 2016-10-22 13:53:56 +08:00 via Android 1
脱离控制台,利用 fork 的方法成为 init 的子进程就算是生成服务了,至于 reload 可以将 int 信号量覆盖成 reload , stop restart 当然就是记录下 pid 发送相应的信号量 kill 掉就好了,反正我是这么写的。
unix 环境高级编程里面有,你也可以看看各个开源项目怎么写的,学一学 |
11
tongpeng1995 OP 感谢楼上各位的回复,谢谢
|
12
jy01264313 2016-10-22 15:22:01 +08:00
supervisor
|
13
skydiver 2016-10-22 16:38:42 +08:00 via Android
@yangyaofei 是信号,不是信号量
|
14
WuMingyu 2016-10-22 18:47:28 +08:00 via Android
systemd service
|
15
zander 2016-10-22 19:01:48 +08:00
写个 sh 代替主程序就行了, sh 里对各种命令作出反应。
|
16
sammo 2016-10-22 21:50:08 +08:00
|
17
yangyaofei 2016-10-23 00:19:47 +08:00 via Android
@skydiver 啊……对对对……打错了…
|