C++ C++;Docker容器中的程序

C++ C++;Docker容器中的程序,c++,docker,C++,Docker,我在容器中使用以下函数来执行命令行参数cd/mypath&&sha1sum-c mysha1sumfile,将/mypath中可用文件的sha1sum与同一路径中mysha1sumfile中的值进行比较。当我以二进制方式执行该命令时,该命令正在运行。当我通过执行/bin/bash(容器内部)在容器内部手动尝试时,同样的情况也会发生。但不是从程序中工作 executeCmd(const char* command) { string response = ""; char buffer[2

我在容器中使用以下函数来执行命令行参数
cd/mypath&&sha1sum-c mysha1sumfile
,将/mypath中可用文件的sha1sum与同一路径中mysha1sumfile中的值进行比较。当我以二进制方式执行该命令时,该命令正在运行。当我通过执行/bin/bash(容器内部)在容器内部手动尝试时,同样的情况也会发生。但不是从程序中工作

executeCmd(const char* command)
{
  string response = "";
  char buffer[256];   
  FILE* pipe = popen(command,"r");  

  if(!pipe)  {  
    response = "ERROR";  
  }  
  while(!feof(pipe)){        
    if(fgets(buffer,128,pipe) != NULL){
      response += buffer;
    }  
  }  
  pclose(pipe);  
  return response;  
}
已验证
pipe
不是
NULL
并且
feof(pipe)
也不是
NULL
。但是
fgets()
返回
NULL


是什么原因造成的?

谢谢您的评论。我可以解决这个问题。这是由于容器内缺少用于shell scrip(“sh”)的libtinfo.so.5库。将库复制到容器内的/lib/后,它开始工作

某些原因导致
std::fgets()
可能失败,并返回一个
NULL
指针,我不知道原因,但您的代码显示了一个常见的误解,
feof
告诉您文件位置是否在“文件末尾”。它不会,而是告诉您是否设置了文件结束标志。仅当上一个操作因文件结束而失败时,才会设置文件结束标志。在出现
fgets
之前调用
feof
来尝试并预测文件结束错误是没有意义的。简言之,我想,
fgets
失败是因为您点击了文件的末尾,尽管您试图避免这样做..谢谢您的评论。我可以解决这个问题。这是由于容器内缺少用于shell scrip(“sh”)的libtinfo.so.5库。将库复制到容器中的/lib/后,它开始工作。您是如何发现的?您必须对Dockerfile进行哪些更改才能解决此问题?