Можно ли запустить программу с вводом из буфера? - PullRequest
1 голос
/ 20 марта 2020

Я хочу запустить программу для цели, которая находится в памяти.

Например, я хотел бы вызвать LaTeX для набора символов в памяти, а не в файле. .

Я понимаю, что могу установить указатель файла в C для целевого объема памяти и чтения / записи в и из памяти.

Однако я не знаю, если есть ли способ передать LaTeX указатель файла или оболочку для этого?

Работает на Arch Linux, мне все равно, получу ли я пока решение, зависящее от среды - просто нужна отправная точка.

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Вот традиционное решение с popen:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char buffer[] =
        "\\documentclass[11pt]{scrartcl}\n"
        "\\begin{document}This is the document.\n"
        "\\end{document}\n";
    FILE *fp = popen("latex", "w");
    if (!fp) perror("latex"), exit(1);
    fputs(buffer, fp);
    fclose(fp);
}
1 голос
/ 20 марта 2020

Самый простой способ - создать файл в / tmp. В большинстве современных систем / tmp монтируется с использованием файловой системы "tmpfs", которая хранит файлы в памяти.

Может быть, вы не хотите полагаться на / tmp как tmpfs. В этом случае вы можете использовать memfd_create для создания дескриптора файла, который хранится только в памяти. Если для LaTeX требуется имя файла, вы можете открыть файл напрямую из вашего процесса, используя /proc/<your pid>/fd/<fd number>.

Третье решение - использовать канал (это то, что popen использует внутри). Это не работает, если LaTeX хочет искать назад или вперед в файле - вы не можете искать в трубе. С другой стороны, канал не должен хранить весь файл сразу.

...