我正在尝试在python中创建一个守护进程.我发现了以下问题,其中有一些我目前正在关注的好资源,但我很好奇为什么需要双叉.我抓住谷歌,发现有足够的资源声明一个是必要的,但不是为什么.
有人提到它是为了防止守护进程获得控制终端.没有第二个叉子怎么做呢?有什么影响?
我在linux平台上开发.
我想在我的库中创建一个新进程而不替换当前正在执行的图像.
因为我正在开发一个库,所以我没有主要功能.
我想在调用程序应用程序关闭后继续新进程(就像CreateProcess Windows API一样).
是否可以在Linux中使用?
像这样的功能:
void Linux_CreateProcess(const char* app_name)
{
// Executing app_name.
// ???????? what is the code ??????
// app_name is running and never close if current application close.
return;
}
Run Code Online (Sandbox Code Playgroud)
注意:
system()阻止当前进程,这并不好.我想继续当前的流程.
exec()系列替换当前正在执行的图像,这并不好.
如果当前进程关闭,popen()将关闭新进程.
我从主控主机到从属主机进行 ZFS 远程复制,其中我有一个在主控主机上运行的 Perl 脚本。
对于每个文件系统,它会 ssh 到远程主机并以侦听模式启动 mbuffer,然后脚本继续发送数据。成功后 mbuffer 应自行退出。
问题
通过 ssh 在远程主机上启动 mbuffer 然后能够继续执行脚本是相当困难的。我最终做了你可以在下面看到的事情。
问题是,在脚本退出之前,它会<defunct>为每个文件系统留下一个进程。
问题
是否可以避免这些<defunct>流程?
sub mbuffer {
my ($id, $zfsPath) = @_;
my $m = join(' ', $mbuffer, '-I', $::c{port});
my $z = join(' ', $zfs, 'receive', , $zfsPath);
my $c = shellQuote($ssh, $::c{slaves}{$id}, join('|', $m, $z));
my $pm = Parallel::ForkManager->new(1);
my $pid = $pm->start;
if (!$pid) {
no warnings; # fixes "exec" not working
exec($c);
$pm->finish;
}
sleep 3; …Run Code Online (Sandbox Code Playgroud)