在linux中使用c ++管道启动程序

时间:2014-04-29 07:51:44

标签: c++ linux

我从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程序,从而启动它?

2 个答案:

答案 0 :(得分:2)

如果popen没有完全符合您的要求,请不要使用它。相反,请使用pipeforkexecdaemonizesetsid等来实现您想要的行为。查看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 &" );