gpt4 book ai didi

c - 通过 rsh 运行守护进程

转载 作者:太空狗 更新时间:2023-10-29 15:39:41 26 4
gpt4 key购买 nike

我想在 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 forker 正在快速完成,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.

谢谢!

最佳答案

1) Why is it paused when I run it through rsh?

当你 fork 一个进程时,子进程有它自己的父进程文件描述符的副本。每个子文件描述符都引用与父文件相应文件描述符相同的打开文件描述。调用fork()后在调用 stdin 之前,您没有关闭子进程中的标准流( stdoutstderrexecve() )所以他们仍然连接到 rsh。只要远程服务器上的任何进程持有对这些流的引用,rsh 就可能不会返回。您可以尝试使用 fclose() 关闭标准流在您调用 execve() 之前或在执行 forker 程序时重定向它们(即 ./forker program >/dev/null 2>/dev/null </dev/null )。

2) How to run some program as daemon in C/C++ in unix-like platforms.

根据 wikipedia , nohup 最常用于在后台作为守护进程运行命令。还有几个daemon related questions在这个网站上你可以引用信息。

来自 wikipedia :

nohup is a POSIX command to ignore the HUP (hangup) signal, enabling the command to keep running after the user who issues the command has logged out. The HUP (hangup) signal is by convention the way a terminal warns depending processes of logout.

如果您的程序将始终作为守护进程运行,您可以研究调用 daemon() 的可能性。从你的程序中。 daemon()某些 UNIX 系统中存在便利函数。

来自daemon(3) man page :

The daemon() function is for programs wishing to detach themselves from the controlling terminal and run in the background as system daemons.

如果您不存在此功能,或者在某些情况下您的程序不作为守护进程运行,您的 forker 程序也可以修改为“守护进程”您的其他程序。


在不对代码进行任何更改的情况下,您可以尝试如下操作:

rsh remote_server 'cd /some_path; nohup ./forker program >program.out 2>program.err </dev/null &'

关于c - 通过 rsh 运行守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2730276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com