2015-05-23 1 views
0

У меня есть Test.cpp, который запускается под sandbox (RHEL7): содержаниередирект стандартный вывод и стандартный поток ошибок в другой файл под песочницу в Linux

test.cpp:

#include<stdio> 
int main(void) { 
    int a = 1/0; 
    return 0; 
} 

компилировать его с помощью GCC (4.8) test.cpp который производит a.out Сейчас работает a.out гравюр floating pointing exception на консоли

Теперь я подумал, что если я перенаправить стандартный поток ошибок в файл, я ожидать, что ошибка будет печататься I n файл. Но это не так, он все еще продолжает печатать на консоли. Googling показывает, что при таком исключении программа немедленно прекращается, и если вы захватываете stderr bash, тогда она должна перенаправляться. Так я бегу

su -c ./a.out 2>err 

Бинго ошибка получить напечатанный в ERR файле.

Теперь MAIN GAME НАЧИНАЕТСЯ я хочу, чтобы запустить его под песочнице так я бегу:

su -c 'sandbox ./a.out 1>out 2>err' 

Но нет ничего печататься в ERR файле или в консоли.

Как записать stdout и stderr в такой ситуации?

+0

** песочница не позволяет вам записывать файлы **, то как вы пишете файлы с помощью 'cat'? – anubhava

+0

Я добавил гораздо больше деталей в вопрос – Bhuvan

+0

Попробуйте эту команду: «su -c» песочница ./a.out '1> out 2> err' – anubhava

ответ

0
sandbox ./a.out > pr 2> err 

В вашем примере вы перенаправлять стандартный вывод в трубу, и STDERR кошачьей подстраховаться.

+0

привет, я редактировал вопрос, чтобы быть более подробным – Bhuvan

1

Чтобы быть ясным (вы упомянули это попутно): Ошибка, которую вы хотите, печатается bash. Это не печатается как умирающий вздох вашей программы. Поэтому важно, чтобы оболочка была перенаправлена.

Когда вы сделали:.

su -c ./a.out 2>err 

Перенаправление является частью оболочки вы выполнили в 2>err открывает err в stderr для su. su создает оболочку, которая наследует stderr и в конечном итоге печатает ошибку.

В этой версии:

su -c 'sandbox ./a.out 1>out 2>err' 

Вы цитировали Перенаправление '... 2>err' так stderr из su не влияет. Команда sandbox перенаправляется. Однако команда sandbox может использовать или не использовать оболочку для запуска команды, или она может использовать exec cmd.... В любом случае, нет оболочки, ожидающей вашего сбоя, чтобы распечатать сообщение.

Вы можете попробовать:

su -c 'sandbox bash -c ./a.out 1>out 2>err' 

Это должно гарантировать, что есть bash с желаемым stderr вокруг, чтобы распечатать результат.

Вы также можете поймать это привести себя (и избежать имея оболочки печати ничего) с чем-то вроде:

#!/bin/sh 

./a.out & 
wait $! 
echo $? 

ссылающегося на него в фоновом режиме будет предотвратить обычный выход. Затем ожидание (с явным PID) вернет код ошибки в $?. Если процесс завершается с сигналом, код ошибки будет 128 + signum (получить список от kill -l)