我正在编写宽度内存和性能敏感的多线程服务器。因此,我需要标准system()
和popen()
调用的替代方法,这些调用不使用fork()
来克隆通常需要花费太多时间的所有进程内存。
似乎需要使用vfork()
然后使用execve()
来制作它。
有人可以帮助我完成两个功能:
system()
来电的替换。 行为示例: 一个线程调用函数执行例如touch filename
并调用线程等待直到执行结束。 (所有其他线程必须继续工作) popen()
调用 行为示例: 相同的行为,但需要输出命令,例如ls -flags
< / em>(此代码的替代方法:Correct Code - Non-blocking pipe with popen)感谢
答案 0 :(得分:3)
这只是建议如何处理您提出的解决方案。对于您要询问的两个具体行动:
touch
:您可以通过打开和关闭要触摸的文件来达到类似的效果
O_TRUNC
open
标记
ls
:这有点痛苦,因为你需要在POSIX系统上使用dirent.h
,然后走过
opendir
readdir
closedir
如果您想使用system
替换等效的popen
和vfork
,则需要注意一些事项。使用vfork
调用有点棘手,因为如果孩子在调用后立即执行exec
以外的任何操作,则有可能破坏父代的内存状态。
替换为system
:
system
,也可以解析命令字符串并调用exec
system
替换函数中,创建一个arg向量来调用帮助程序并将你真正想要执行的程序字符串作为参数传递给该程序vfork
后,您立即exec
孩子的帮助程序在popen
替换中:
stdout
和stdin
文件描述符作为参数,以及要执行的命令的字符串
0
或1
(或两者),如参数所示popen
执行字符串,也可以执行父项和子项之间的代理数据,或者在解析命令字符串后调用exec
popen
替换函数中pipe
创建stdout
或stdin
通信渠道(根据第二个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