Моя цель - разработать программу python, которая имеет расширение C для вызова некоторых библиотек C. Наконец, чтобы сделать решение как часть контейнера Docker.
Я написал скрипт Python с расширением C, который загружает некоторые C dll и выполняет некоторые операции. Библиотека C имеет код для вызова команды оболочки с помощью popen (), а вывод команды читается из канала с помощью fgets (). Если я выполняю сценарий python вне контейнера Docker, он выполняется отлично. Если я выполняю исполняемый файл C dll через C внутри контейнера Docker, он выполняется отлично. Если я выполняю сценарий python внутри контейнера Docker, то при первом вызове функции fgets () ФАЙЛА *, возвращаемого popen (), возникает ошибка сегментации.
Я запускаю свой контейнер Docker с - привилегированный = true опция. Код 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);
}
}
Позже я заменил popen () на system () и выгрузил вывод команды в файл, а затем открыл файл theat с помощью fopen () и прочитал контент через python скрипт. Интересно, что это тоже работает. Таким образом, похоже, что вызов popen () из C расширения скрипта Python внутри контейнера Docker - единственная проблема.
Оцените любую помощь или указания по этому вопросу. Дайте мне знать, если у вас есть какие-либо вопросы о конфигурации файла Docker или о чем-либо еще.
Дополнительная информация: Я использую Ubuntu 18.04 в качестве ОС, Python3 .7 и g cc ( G CC) 4.8.5 20150623 (Red Hat 4.8.5-36) Вот файл Docker.
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"]