使用不克隆进程内存的调用替换system和popen调用

时间:2012-06-11 21:09:23

标签: c++ memory system popen

我正在编写宽度内存和性能敏感的多线程服务器。因此,我需要标准system()popen()调用的替代方法,这些调用不使用fork()来克隆通常需要花费太多时间的所有进程内存。

似乎需要使用vfork()然后使用execve()来制作它。

有人可以帮助我完成两个功能:

  • system()来电的替换。 行为示例: 一个线程调用函数执行例如touch filename并调用线程等待直到执行结束。 (所有其他线程必须继续工作)
  • 替换popen()调用 行为示例: 相同的行为,但需要输出命令,例如ls -flags < / em>(此代码的替代方法:Correct Code - Non-blocking pipe with popen

感谢

2 个答案:

答案 0 :(得分:3)

这只是建议如何处理您提出的解决方案。对于您要询问的两个具体行动:

  • touch:您可以通过打开和关闭要触摸的文件来达到类似的效果
    • 请注意不要在O_TRUNC
    • 上使用open标记
  • ls:这有点痛苦,因为你需要在POSIX系统上使用dirent.h,然后走过
    • opendir
    • readdir
    • 确保在完成后致电closedir

如果您想使用system替换等效的popenvfork,则需要注意一些事项。使用vfork调用有点棘手,因为如果孩子在调用后立即执行exec以外的任何操作,则有可能破坏父代的内存状态。

替换为system

  • 创建一个帮助程序来执行参数中提供的字符串
    • 帮助程序可以在提供的参数上调用system,也可以解析命令字符串并调用exec
  • 在你的system替换函数中,创建一个arg向量来调用帮助程序并将你真正想要执行的程序字符串作为参数传递给该程序
  • 致电vfork后,您立即exec孩子的帮助程序
  • 父母等待孩子完成

popen替换中:

  • 创建一个帮助程序,接受stdoutstdin文件描述符作为参数,以及要执行的命令的字符串
    • 帮助程序会将传入的描述符复制到01(或两者),如参数所示
    • 帮助程序可以使用popen执行字符串,也可以执行父项和子项之间的代理数据,或者在解析命令字符串后调用exec
  • 在您的popen替换函数中
  • ,使用pipe创建stdoutstdin通信渠道(根据第二个popen函数参数)并创建一个arg向量来调用帮助程序,传入适当的文件描述符号和命令字符串作为参数
  • 致电vfork后,您立即exec孩子的帮助程序
  • 您需要pclose替换才能获得子进程

答案 1 :(得分:0)

Another way is to use the "fork()" with "execvp()" in child process. as mentioned by @jxh

int pid = fork();

if( pid == 0)
{
// In child process
  // redirect stderr/stdinput/stdoutput
  // prepare the execution command
  //use the exec() family of functions as per specific requirement.
}
else
{
// In parent process
  // check for open pipes and close the Std Output/Input/Error pipes.
}

详细信息参考

https://www3.physnet.uni-hamburg.de/physnet/Tru64-Unix/HTML/APS33DTE/DOCU_004.HTM