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进行哪些更改才能解决此问题?