Как обработать файл C ++, скомпилированный внутри сервера C? - PullRequest
0 голосов
/ 23 января 2019

Мне нужно сделать сервер, который: 1) компилирует файл c ++ и сохраняет ошибки в файле, если они существуют; 2) если ошибок нет, я должен запустить файл a.out и извлечь вывод в другой файл. Проблема заключается в первом.

Чтобы скомпилировать и извлечь ошибки, я использовал больше методов: 1) система ("g ++ file.cpp &> err.txt") - не работает: она печатает ошибки в консоли, но файл остается пустым 2) popen - Ссылка на ссылку: C: Запустить системную команду и получить вывод? : единственное отличие состоит в том, что я открыл другой файл и вместо печати в консоли я использовал fprintf для записи в файл. Я забыл добавить, что первый метод работает, если записан в виде команды в консоли, но внутри сервера проблематично.

// This code is to show what i have already tried and if you find any
// syntax errors like ; or ' pls ignore them as i couldn't copy the code
// from the docker console. Thank you very much!
//1
system("g++ file.cpp &> err.txt");
if( access( "a.out", F_OK ) != -1 ) {
    system("./a.out > output.txt");

//2
    FILE *f;
char buff[200];

f = popen("g++ file.cpp", "r");
if (f == NULL) {
    printf("Failed to run command\n" );
    exit(1);
}
FILE *o;
o = fopen("err.txt", "w");
while (fgets(buff, sizeof(buff)-1, f) != NULL) {
    fprintf(o, "%s", buff);
}
fclose(o);
fclose(f);

Я ожидал, что ошибки будут записаны в файле err.txt, который не будет напечатан в консоли, и во всех приведенных выше примерах он печатает в консоли, а файл err.txt остается пустым.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Хорошо, так что, в конце концов, этот был довольно близок: system ("g ++ file.cpp &> err.txt"); Решение: system ("g ++ file.cpp> err.txt 2> & 1");

0 голосов
/ 23 января 2019

Вы можете сделать это по-старому:

  1. fork() и у ребенка:

  2. Открыть файл для хранениястандартный вывод и еще один для ошибок.

  3. Используйте dup2(oldfd, newfd) для дублирования дескрипторов двух файлов до stdout и stderr соответственно.

  4. Вызвать execlp с помощью gcc и его аргументов.

  5. В родительском процессе вы можете добавить waitpid вызов для ожидания завершения дочернего процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...