我想在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 utilforker很快就完成了,bash‘没有暂停’,util作为守护进程运行。
但如果我跑了
scp forker remote_server://some_path/
scp program remote_server://some_path/
rsh remote_server 'cd /some_path; ./forker program'然后一切都一样(即在remote_sever上,forker正在快速完成,util正在运行),但是我在本地机器中的bash被暂停了。它在等我停下来(我查过了)。如果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!
发布于 2010-04-28 16:37:27
1)为什么当我在rsh?中运行它时,它会被暂停?
当您分叉一个进程时,子进程有它自己的父进程文件描述符的副本。每个子文件描述符引用相同的打开文件描述和父文件描述符的对应文件描述符。在调用fork()之后,您不会在调用execve()之前关闭子进程中的标准流(stdin、stdout、stderr),因此它们仍然连接到rsh。在这种情况下,只要远程服务器上的任何进程都包含对这些流的引用,rsh就不会返回。您可以尝试在调用fclose()之前使用execve()关闭标准流,或者在执行forker程序(即./forker program >/dev/null 2>/dev/null </dev/null)时重定向它们。
2)如何在类unix平台的C/C++中以守护进程的形式运行某些程序.
根据维基百科的说法,nohup最常用作后台运行命令的守护进程。在这个站点上也有几个与守护进程有关的问题,您可以参考它获取信息。
来自维基百科
nohup是一个POSIX命令,它忽略HUP (挂起)信号,使命令能够在发出命令的用户注销后继续运行。HUP (挂起)信号按照惯例是终端根据注销进程发出警告的方式。
如果您的程序将始终作为守护进程运行,则可以研究从程序中调用daemon()的可能性。daemon()方便功能存在于某些UNIX系统中。
来自守护进程(3)手册页
daemon()函数用于希望与控制终端分离并作为系统守护进程在后台运行的程序。
如果您不存在此函数,或者您的程序不作为守护进程运行的实例,您的forker程序也可以被修改为“守护”您的其他程序。
在不对代码进行任何更改的情况下,您可以尝试如下所示:
rsh remote_server 'cd /some_path; nohup ./forker program >program.out 2>program.err </dev/null &'
https://stackoverflow.com/questions/2730276
复制相似问题