带有Python3和C扩展的Docker使用popen()导致分段错误

时间:2020-03-14 08:26:28

标签: python c docker segmentation-fault popen

我的目标是开发一个python程序,该程序具有一些C扩展名以调用某些C库。最后将解决方案作为Docker容器的一部分。

我写了一个带有C扩展名的Python脚本,该脚本加载了一些C dll并执行了一些操作。 C库具有通过popen()调用shell命令的代码,并且使用fgets()从管道读取命令的输出。 如果我在Docker容器之外执行python脚本,则执行效果完美。 如果我通过Docker容器内的C可执行文件执行C dll,它将完美执行。 如果我在Docker容器中执行python脚本,则在第一次调用popen()返回的FILE *的fgets()时会导致分段错误。

我正在使用-privileged = true 选项运行Docker容器。 崩溃的C代码看起来像

void readDir(){

        char cmd[] = "ls -l /home/user1/*";
        FILE* fp = popen(cmd,"r");

        if (!fp){
                printf("popen didn't work");
        }
        else{
                char buf[256]={'\0'};
                fgets(buf,sizeof(buf),fp);
                printf("buf=%s\n",buf);
                pclose(fp);
        }
}

稍后,我用system()替换了popen(),并将命令的输出转储到文件中,然后使用fopen()打开theat文件并通过python脚本读取内容。有趣的是,这也有效。 因此,似乎唯一的问题是从Docker容器内的Python脚本的C扩展名调用popen()。

感谢对此事的任何帮助或指导。让我知道您是否对Docker文件配置有任何疑问。

其他信息: 我正在使用Ubuntu 18.04作为OS,Python3.7和gcc(GCC)4.8.5 20150623(Red Hat 4.8.5-36) 这是Dockerfile。

FROM ubuntu:18.04
FROM python:3.7
RUN mkdir -p  /etc/apt/sources.d/
RUN apt-get -y update && apt-get install -y systemd && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN cd /lib/systemd/system/sysinit.target.wants/; ls | grep -v systemd-tmpfiles-setup | xargs rm -f $1 \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*; \
rm -f /lib/systemd/system/plymouth*; \
rm -f /lib/systemd/system/systemd-update-utmp*;
RUN systemctl set-default multi-user.target
ENV init /lib/systemd/systemd
VOLUME [ "/sys/fs/cgroup" ]
VOLUME [ "/usr"]

0 个答案:

没有答案