C ++ popen引导后未返回正确的输出

时间:2019-06-13 11:13:41

标签: c++ linux service popen

在Linux上执行popen时有些奇怪。因此,基本上在更大的应用程序中,我有一个名为execute的函数,该函数通过使用popen运行命令并返回其stdout输出。

#define CMD "some_command -s"     // This is the command
#define MAX_BUF 1024*6

static std::string execute(const char* cmd) {
        std::string result;
        char buffer[MAX_BUF];

        FILE* pipe = popen(cmd, "r");
        if(!pipe)
                throw -1;

        try{
                while(!feof(pipe)){
                        if(fgets(buffer, MAX_BUF, pipe) != NULL)
                                result += buffer;
                }
        }catch(...){
                pclose(pipe);
                throw;
        }

        pclose(pipe);
        return result;
}

通常正常,重新启动系统时出现问题。如果应用程序作为服务的守护程序运行,则如果该服务在引导时运行,则result变量的大小为0。进行service name_of_service restart杀死并重新启动应用程序后,它便开始工作,并且result可变大小是预期的大小。

还尝试在运行system("some_command -s > /tmp/command_out");之前执行popen,并且文件/tmp/command_out具有预期的输出。因此,这不是some_command依赖项尚未初始化的竞争条件。

更新

同时在另一个终端上运行命令也可以。在服务内部,如果我将some_command -s更改为其他命令,例如ls /tmp,则popen确实会产生一些输出。

0 个答案:

没有答案