【发布时间】:2011-02-13 09:20:15
【问题描述】:
我想在 Unix 的远程机器上将程序作为守护进程运行。我有 rsh 连接,我希望程序在断开连接后运行。
假设我有两个程序:util.cpp 和 forker.cpp。
util.cpp 是一些实用程序,为了我们的目的,让它只是无限根。
util.cpp
int main() {
while (true) {};
return 0;
}
forker.cpp 获取一些程序并通过 fork() 和 execve() 在单独的进程中运行它:
forker.cpp
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char** argv) {
if (argc != 2) {
printf("./a.out <program_to_fork>\n");
exit(1);
}
pid_t pid;
if ((pid = fork()) < 0) {
perror("fork error.");
exit(1);
} else if (!pid) {
// Child.
if (execve(argv[1], &(argv[1]), NULL) == -1) {
perror("execve error.");
exit(1);
}
} else {
// Parent: do nothing.
}
return 0;
}
如果我跑:
./forker util
forker 很快就完成了,bash '没有暂停',而 util 正在作为守护进程运行。
但如果我跑:
scp forker remote_server://some_path/
scp program remote_server://some_path/
rsh remote_server 'cd /some_path; ./forker program'
那么一切都是一样的(即在 remote_sever 分叉器正在快速完成,util 正在运行)但是我在本地机器上的 bash 被暂停了。 它正在等待 util 停止(我检查了它。如果 util.cpp 正在返回,那就没问题了。),但我不明白为什么?!
有两个问题:
1) Why is it paused when I run it through rsh?
我确信我选择了一些愚蠢的方式来运行守护进程。所以
2) How to run some program as daemon in C/C++ in unix-like platforms.
Tnx!
【问题讨论】: