Запутанное возвращаемое значение из встроенного приложения

Я пытаюсь вызвать одно приложение из другого в C ++. Встроенное приложение подвержено ошибкам сегментации из-за синтаксических ошибок во входном файле, поэтому внешняя программа будет отвечать за повторный запуск внутреннего файла и ошибки журналирования.

Моей непосредственной идеей было положиться на возвращаемое значение внутренней программы. Поэтому я начал экспериментировать с этим. Я написал фиктивную программу в Inner.cpp:

#include <iostream>

int main()
{
std::cout << "Inner" << std::endl;
return 22;
}

Затем я написал это в Outer.cpp:

#include <cstdlib>
#include <iostream>

int main()
{
int retval = system("~/Inner");
std::cout << "Returned: " << retval << std::endl;
return 0;
}

Получил этот запутанный вывод:

Inner
Returned: 5632

Итак, я начал читать. Вскоре я узнал, что проходят только 8 бит LS, которые обрабатываются без знака. Но разве это не означает, что мы не будем использовать значения выше 255? Почему я получаю это странное значение?

Поэтому я начал смотреть на биты.

What I expected: 22 -> 0000 0000 0000 0000 0000 0000 0001 0110
What I got:    5632 -> 0000 0000 0000 0000 0001 0110 0000 0000

Вау, это та же самая картина, только что сдвинутая. И действительно, когда я изменил мою строку:

std::cout << "Returned: " << (retval >> 8) << std::endl;

Я всегда получал точное число, которое хотел. Тем не менее, я не могу найти ничего о том, почему это происходит, и теперь я обеспокоен тем, что есть еще много сюрпризов, когда я доберусь до той части, где мне нужно будет обнаружить SIGSEGV во внутренней программе и продолжить выполнение во внешнем.

В конечном итоге мой вопрос: каков наилучший способ безопасного встраивания одного приложения (командной строки) в другое, учитывая, что им необходимо передать некоторые минимальные данные, а вызываемое может в конечном итоге привести к ошибкам?
(Кроме того, что это за штука со сдвигом и возвращаемым значением?)

Ubuntu 12.04.4 LTS
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

5

Решение

Вы хотите использовать fork, exec а также wait, что-то вроде:

int status;
if ((pid = fork()) == 0) // child proc
exec("~/Inner");
else // parent
waitpid(-1, &status, 0)
2

Другие решения

Используйте WEXITSTATUS

int retval = system("~/Inner");
retval = WEXITSTATUS(retval);

Сделаю

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector