在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确实会产生一些输出。