Проблема в том, что python
ведет себя как REPL по умолчанию только тогда, когда ввод tty. Без tty это просто REP:
# Hangs until the pipe is closed with Ctrl+D
{ echo 'print "lol"'; cat; } | python
У вас есть несколько вариантов в зависимости от того, что вы хотите сделать. Два из них включают в себя:
Запустите python -i
, чтобы получить REPL (char *cmd[] = {"python", "-i", (char *) NULL}
). Это покажет все интерактивные подсказки и тому подобное, так что вам придется читать больше данных.
Закройте канал, чтобы Python знал, что скрипт выполнен. Это заставит его выполнить его.
Вот ваш код, адаптированный для этого:
#include <unistd.h>
#include <sys/prctl.h>
#include <signal.h>
int main()
{
int inpipe[2], outpipe[2], pid, in_bytes;
char *cmd[] = {"python", (char *) NULL}, buff[1024];
pipe(inpipe);
pipe(outpipe);
pid = fork();
if (pid == 0)
{
dup2(inpipe[1], 1);
dup2(inpipe[1], 2);
dup2(outpipe[0], 0);
close(outpipe[0]);
close(outpipe[1]);
prctl(PR_SET_PDEATHSIG, SIGTERM);
execve("/usr/bin/python", cmd, NULL);
}
close(inpipe[1]);
close(outpipe[0]);
write(outpipe[1], "print \"lol\"\n", 12);
close(outpipe[1]);
in_bytes = read(inpipe[0], buff, 1024);
write(1, buff, in_bytes);
close(inpipe[0]);
close(outpipe[1]);
return 0;
}