当程序写得越来越大,进程占用的内存也就越来越多,调用popen时会返回空的FILE指针,网上说原因是system或popen这样的系统函数,其内部实现是调用fork函数创建子进程,创建过程中会复制父进程堆、栈等资源,这样就容易造成创建失败,返回NULL。
以下是我写的用vfork替换fork调用的Vpopen类。
Vpopen.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #pragma once #include <stdio.h> #include <sys/types.h> #include <unistd.h> class Vpopen { FILE *fp_; pid_t pid_; int pipeFd_[2]; public: Vpopen(); ~Vpopen(); FILE *open(const char *cmd, const char *flags); void close(); }; |