我有一个用 C++ 编写的程序,旨在在 Linux 操作系统上运行。忽略程序的大部分内容,归结为 - 它在一段时间后启动 X 个可执行文件(为简单起见,让我们使用 5 秒)。
目前,我正在使用system(path/to/executable/executable_name)
执行可执行文件的实际启动,这对于启动可执行文件来说效果很好。
我还试图维护每个可执行文件的状态(再次简单起见,我们只是说状态是“UP”或“DOWN”(运行或未运行))。我已经能够做到这一点......有点......
稍微备份一下,当我的程序被告知启动可执行文件时,逻辑如下所示:
pid = fork()
if (pid < 0) exit 0; //fork failed
if (pid == 0) {
system(path/to/executable/executable_name)
set executable's status to DOWN
} else {
verify executable started
set executable's status to UP
}
这就是我的问题。fork()
导致产生一个子进程,这是我认为我需要的,以便原始进程继续启动其他可执行文件。我不想等待可执行文件停止以启动另一个。
但是,可执行文件在另一个子进程中启动......它与父进程分开......如果我在系统返回时尝试在子进程中将可执行文件的状态设置为 DOWN,则父进程不知道它。 ..
我对我可能需要做的事情有一些想法:
- 使用线程而不是 fork:创建一个新线程来调用系统,但是父/主线程会知道新线程会改变可执行文件的状态吗?
- 使用 fork 和 exec:但我不确定这会比我已经拥有的更好(我已经阅读了 fork 和 exec 的手册页,但我想我对如何最好地利用 exec 仍然有点模糊)
有什么建议么?
编辑 1 我想我最好为逻辑提供更多背景信息:
void startAll() {
for each 'executable'
call startExecutable(executable_name)
}
...
void startExecutable (executable_name) {
pid = fork()
if (pid < 0) exit 0; //fork failed
if (pid == 0) {
system(path/to/executable/executable_name)
set executable's status to DOWN
exit (1); <-- this is because once the child process's system returns, I don't want it to return to the above loop and start starting executables
} else {
verify executable started
set executable's status to UP
}
}
编辑 2 如开头所述,这是假设一个简化的设置(如果你愿意,第一次运行)。该计划不仅要处理“UP”或“DOWN”状态,还要处理向我的程序已启动的可执行文件发送消息的第三种状态——“STANDBY”。我最初忽略了这一部分以避免使解释复杂化,但我现在看到包含在内是必要的。