我从Linux中的C ++程序启动程序如下:
char* cmd = "/bin/snmpd &"; // command to execute
FILE* pipe = popen(cmd, "r"); // pipe to command line
if (!pipe) return -1; // check if pipe worked
pclose(pipe); // close pipe
return 1; // return
现在启动snmpd,但问题是,当这个C ++程序关闭时,snmpd会关闭它。如何在没有启动程序的情况下从另一个C ++程序启动Linux程序,从而启动它?
答案 0 :(得分:2)
如果popen
没有完全符合您的要求,请不要使用它。相反,请使用pipe
,fork
,exec
,daemonize
,setsid
等来实现您想要的行为。查看example popen
implementation作为起点。
答案 1 :(得分:2)
你启动程序的方式,你告诉系统
从程序到标准输出的所有输出都应该进入
你的程序的管道。然后关闭的管道。写作
到一个关闭的管道导致SIG_PIPE
;除非
你开始的程序会对这个信号做一些特别的事情
将被终止。
如果您对该计划的输出不感兴趣,那么
应该使用标准函数system
来启动它:
system( "/bin/snmpd &" );
应该在你的情况下做到这一点。 (system
将开始
一个子shell,并等待子shell完成,但是&
表示子shell不会等待snmpd
完成。)
根据你在做什么,你可能想要“妖魔化”
您开始的过程,将其与您的过程组断开连接,以便
即使你注销它也不会被杀死。我不太确定
关于这一点(我总是在较低的水平上完成),但我认为
只是重定向标准输出和标准错误(也许也是
标准in)使用/dev/null
应该做的伎俩:
system( "/bin/snmpd < /dev/null > /dev/null 2>&1 &" );