C++ 未找到命令时出现SEGFULT popen

C++ 未找到命令时出现SEGFULT popen,c++,linux,C++,Linux,编写了一个程序,该程序有一个方法,可以将popen命令打开到一个临时文件,读取输出并进行解析,以便在程序中的其他地方使用。如果命令成功,程序将按预期工作。但是,如果popen尝试一个失败的命令,文件仍然有一个有效的指针,但是当程序尝试读取带有fgets的数据时,程序seg会出现故障 职能机构: std::map<std::string,size_t> cols; const char* command = command_string.c_str();

编写了一个程序,该程序有一个方法,可以将
popen
命令打开到一个临时文件,读取输出并进行解析,以便在程序中的其他地方使用。如果命令成功,程序将按预期工作。但是,如果
popen
尝试一个失败的命令,文件仍然有一个有效的指针,但是当程序尝试读取带有
fgets
的数据时,程序seg会出现故障

职能机构:

      std::map<std::string,size_t> cols;
      const char* command = command_string.c_str();

      if (FILE *fp = popen(command,"r")) {
          char buff[linesize];
          std::vector<std::string> list;
          std::cout << "here, popen succeeded\n";
          std::cout << fp << '\n';
          while (fgets(buff,linesize,fp)) {
              std::cout << "here, fgets succeeded\n";
              std::string data(buff);
              list.push_back(data);
          }
          parse_cols(list);
          pclose(fp);
      }
      else {
          std::cout << "Failed to open bash shell when trying to run command\n";
          std::exit(EXIT_FAILURE);
      }

有可能处理这个错误吗?这是一个有点有用的错误,但我希望能够处理它,而不是仅仅依靠seg故障。我试着查看
文件
结构,但对于不同的C库版本,它似乎有所不同。

Popen是个怪兽。当
fork
pipe
失败时,它只返回
nullptr
,但在您的情况下,它们不会返回

但是,您的程序不应出现故障。当shell返回failure时,您应该从有效(尽管是空的)流中读取。Than
fgets()
返回NULL,因为文件结尾时未读取任何字符


然后调用
parse\u调用
——一个我们看不到的函数——但我有理由相信它无法处理空列表。崩溃堆栈可以进一步帮助确定实际问题,而实际问题不在
popen
fgets

程序是否在
fgets()
本身中发生故障?你能贴一个堆栈跟踪吗?我是一个错误。你确定这是fgets崩溃了吗?当给定一个空列表时,你的parse_cols函数不是表现不好吗?我不熟悉popen,但手册页谈到了fork或pipe失败或无法分配内存时返回的错误(因此为空)。我假设它成功了,fgets()返回null(因此跳过while循环),而segfault实际上发生在parse_cols(list)。。。因为我不知道密码,我不知道为什么。您可以将从fgets返回的初始NULL处理为失败,但您需要重新构造循环以正确执行此操作。错误可能在
parse\u cols
中,您可以将此函数的代码添加到您的问题中吗?是的,它是
parse\u cols
函数,对我来说应该是相当明显的,谢谢大家指出这一点。在列表向量上添加了一个空检查,修复了它是的,我应该考虑检查它,因为
while
循环不存在executing@MartinBoros另一方面,通常使用
popen
可能不是一个好主意(除非这是一个学习练习)在C++程序中有更好的方法使用<代码> shell >代码>命令输出吗?顺便说一下,我必须使用一个相当旧的
c++0x
。它适用于QA服务器上的数据监控系统,每周运行一次,如果出现故障,这不是什么大问题,但我希望它尽可能可靠possible@MartinBoros通常最好通过其他方式访问数据,而不是执行shell,因为shell太不可预测,并且取决于您无法控制的因素(操作系统版本、shell版本等)。但是,如果您的全部任务是执行一个程序并检查其输出,那么popen显然不是一个坏选择。好的,是的,它只是检查程序的输出并记录从中产生的低质量数据。谢谢您的建议
here, popen succeeded
0x1cc2430
sh: my_command: command not found
Segmentation fault (core dumped)