popen返回NULL

当程序写得越来越大,进程占用的内存也就越来越多,调用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();
};

Read more