fork用于创建从中调用的进程的副本.通常会调用exec系列函数.除此之外还有叉子的用法吗?我能想到一个.用管道功能做IPC.
从命令行启动时,某些程序会立即返回,例如Firefox.大多数实用程序(以及我编写的所有程序)都与创建它们的shell绑定在一起.如果你控制命令行,程序就死定了.
你有什么必须添加到程序或shell脚本以获得立即返回的行为?我想我在那里问了两个问题,一个用于shell脚本,一个用于一般,如果它们不同的话.我特别想知道是否有办法让一个可执行的jar来做.
我几乎不好意思问一个,但我自己找不到答案.
谢谢!
在 python3 中,我正在创建分叉的子进程,我认为它是正确退出的。这是一些代码示例:
import os
child_pid = os.fork()
if child_pid == 0:
print("I am in the child with PID "+str(os.getpid()))
# doing something
a = 1+1
print("Ending child with PID "+str(os.getpid()))
os._exit(0)
else:
#parent process
os.waitpid(-1, os.WNOHANG)
import time
for x in range(100):
time.sleep(1)
print("waiting...")
Run Code Online (Sandbox Code Playgroud)
现在,由于子进程似乎已结束,因此它仍然可以被视为“已失效”进程(而父进程仍在运行)。如何真正摆脱已结束的子进程?如何更改代码?
我一直在为Linux的perl守护进程工作,这是它的骨架:
#!/usr/bin/env perl
use File::Copy;
use Socket;
use Sys::Hostname;
use POSIX qw(setsid);
use Env;
use Sys::Info::Constants qw( :device_cpu );
my $daemonName = 'proc';
my $proc;
my $error;
my $file = "Proc.pl";
my $pidfile = ">/var/run/proc.pid";
my $pid2check = "/var/run/proc.pid";
my $pid;
if (!$error) {
LogMessage("$daemonName : PID $proc : Begin");
}
if (!$error) {
LogMessage("$daemonName : PID $proc : Writing pid information to $pidfile");
print FILE $proc . "\n";
close (FILE);
}
$SLEEP_TIME = 5; # seconds
#Main loop of …Run Code Online (Sandbox Code Playgroud) 我wodering为什么人们叫fork()两次,为什么在执行第一个呼叫之前 setsid().
是的,如果调用者已经是进程组负责人,则不会创建新会话.但是,如果我不让(大)父母成为流程组组长呢?谁会为我做(不问我)?(好吧,也许1llum1n4t1,Sc13nt0l0gy,国家安全局,......;))
是的,第一个孩子应立即退出,不要创建僵尸进程.但是,(大)父母不能在分叉后退出吗?或者一两个fprintf(stderr,...或者write(2,...电话(如"成功启动守护程序xy")会是如此重要?(我不能以另一种方式阻止僵尸吗?)
总而言之,这种双重fork()"神奇"真的需要(不要麻烦)吗?或者它只是传统或所谓的"最佳实践"(如避免goto)?或者它是否只是保证守护进程能够处理"历史"(当然我的意思是"在生产环境中使用太旧")平台,如SVr4,BSD 3,RHEL 2或一些蹩脚的32位嵌入式平台?
我正在尝试为shell执行管道实现.我已经按照以下方式实现了它的工作原理.例如:如果我想这样做,ls | grep x | grep y | grep z,我正在从父进程创建4个子进程并使用它们.有没有其他方法可以做到这一点?
例如:我可以使用以下流程创建它吗?而不是让单个父进程有4个孩子,'grep z'可以是'grep y'的孩子而'grep y'是'grep x'的孩子,依此类推?
我很好奇如何在bash shell中实现管道功能.我尝试下载源代码并理解它但丢失了.
我遇到过一个正在运行的脚本(myDir/myScript.sh arg1 arg2 &)
根据我的理解,它在子 shell 中以及该子 shell 的后台运行脚本。
myDir/myScript.sh arg1 arg2 &如果我运行不带括号的脚本来创建新的子 shell,会产生任何副作用吗?
我正在用PHP做一个工具供我个人使用.但PHP非常慢,我需要做的任务需要花费很多时间,因此我将在c ++中创建一个守护进程并将其保留在后台(它将在VPS中运行).
PHP将通过简单的tcp套接字连接到守护进程(我将尝试设计/使用简单的IPC协议)以提交任务.守护程序将使用简单的FIFO队列管理任务.PHP只会启动任务,但它不会等到它结束,因为它可能需要几分钟(PHP也会监视任务 - 但这是另一个主题).
Web/PHP界面根本不是问题.但我没有unix守护程序编程的经验.我在Linux上用c ++制作了简单的控制台程序,所以我只需要一本手册/书籍/指南和建议来开始使用unix守护进程.
谢谢.
希望在c ++中分叉一个不会挂起其父进程的进程 - 它的父进程是守护进程并且必须保持运行.如果我在分叉进程上等待(),分叉的execl将不会分流 - 但是 - 它也会挂起应用程序 - 而不是等待修复应用程序挂起 - 但命令变得无法解决.
if((pid = fork()) < 0)
perror("Error with Fork()");
else if(pid > 0) {
//wait here will hang the execl in the parent
//dont wait will defunt the execl command
//---- wait(&pid);
return "";
} else {
struct rlimit rl;
int i;
if (rl.rlim_max == RLIM_INFINITY)
rl.rlim_max = 1024;
for (i = 0; (unsigned) i < rl.rlim_max; i++)
close(i);
if(execl("/bin/bash", "/bin/bash", "-c", "whoami", (char*) 0) < 0) perror("execl()");
exit(0); …Run Code Online (Sandbox Code Playgroud) 我根据http://linux.die.net/man/1/daemonize上的指南在 Linux 上编写了一个守护程序,但是该进程崩溃了几次,我找不到原因。它困扰了我几天。
今天我碰巧读了 W.Richard Stevens 所著的“UNIX 网络编程第 1 卷,第三版”。在本书中,它展示了一个编写守护程序的例子。阅读示例后,我意识到我的代码中缺少“与控制终端解除关联”。
现在我的问题是守护进程,为什么我们需要与控制终端解除关联?它与进程的崩溃有关吗?我的守护进程代码中是否缺少其他任何地方?
感谢您的回复。
这是我的代码:
bool daemonize()
{
// http://linux.die.net/man/1/daemonize
// change working dir to root
(void) uchdir("/");
// close stdin, stderr, stdout
if (int fdnull = open("/dev/null", O_RDWR))
{
dup2 (fdnull, STDIN_FILENO);
dup2 (fdnull, STDOUT_FILENO);
dup2 (fdnull, STDERR_FILENO);
close(fdnull);
}
else
{
Log (ERR, "Failed to open /dev/null");
return false;
}
// detach from previous process group
if (setsid () == -1) /* request a new session (job control) …Run Code Online (Sandbox Code Playgroud)