【发布时间】:2012-06-11 21:09:23
【问题描述】:
我正在编写对内存宽度和性能敏感的多线程服务器。因此,我需要标准system() 和popen() 调用的替代方案,它们不使用fork() 克隆通常需要太多时间的所有进程内存。
看来,需要先使用vfork(),然后再使用execve()。
谁能帮我实现两个功能:
- 替换
system()呼叫。 行为示例: 一个线程调用函数执行例如touch filename并调用线程等待直到执行结束。 (所有其他线程必须继续工作) - 替换
popen()调用行为示例:相同的行为,但需要获取命令的输出,例如ls -flags(此代码的替代方法:@987654321 @)
谢谢
【问题讨论】:
-
fork进行了极大的优化,以避免对所有进程的内存进行大量复制;通常它是通过写时复制来实现的,因此除非绝对必要,否则实际上不会复制任何内存。你确定fork太慢了吗? -
@templatetypedef 是的,3-4 天我在这里寻找解决方案,为什么我的服务器时不时显着减慢(14-30 秒)。现在我有 80% 的把握,那就是它的内存问题。我的服务器是~100-300mb,然后在需要
200 mb的popen()调用中调用ffmpeg,所以,现在的父级不少于200 mb,并且似乎在popen()调用它的速度变慢了..不知道是谁写信给它,也许是系统问题,因为我在 freebsd 7.4(但服务器是四核)上没有看到任何延迟......但是在旧的(两个核心)和 freebsd 6.4 上,延迟是 14-30 秒。