Выполнить команду оболочки Linux в С++, скрывая ее вывод

Я хочу выполнить команду оболочки Linux из «/sbin/» с помощью execl или system (или другой команды) и скрыть ее вывод.

Я уже использую «вилку», чтобы получить дочерний процесс...

Типа если бы я вошел...

service "servicename" restart

Я бы увидел вывод, где написано «перезапуск xyz [OK]». Вместо этого я просто хочу, чтобы команда выполнялась молча, а ее вывод отбрасывался, а не отображался в моем консольном приложении.


person r4d1um    schedule 19.11.2012    source источник
comment
Это безнадежно расплывчато. Ты должен сказать, что ты здесь делаешь. Это, вероятно, не имеет ничего общего с C++. Вам просто нужно прочитать справочные страницы для вызовов, которые вы используете. Вы, вероятно, захотите никогда не использовать system для пользовательского ввода, потому что он интерпретирует его с помощью оболочки. Возможно, вам просто нужно напомнить, чтобы снова открыть stdout и stderr между fork и exec?   -  person Nicholas Wilson    schedule 19.11.2012
comment
У меня нет пользовательского ввода, я использую программу C++, которая перезапускает 2 определенные службы.   -  person r4d1um    schedule 19.11.2012
comment
возможный дубликат Как выполнить сценарий оболочки из C в Линукс?   -  person Donal Fellows    schedule 13.12.2012


Ответы (2)


Перенаправить вывод на /dev/null

Eg.,

service smb restart 1> /dev/null

service smb restart 2> /dev/null

где 1 и 2 представляют stdout и stderr

person Sakthi Kumar    schedule 19.11.2012
comment
с командой C++ для ее выполнения вывод не должен перенаправляться на стандартный вывод, не так ли? - person coder543; 19.11.2012
comment
Извините, что вы подразумеваете под командой C++? Во всех Unix дочерние процессы наследуют все fd, включая stdout и stderr. Более того, после разветвления (до выполнения) процесс является клоном, поэтому очевидно, что его выходные данные попадают точно в то же место, что и родитель. При выполнении стандартные потоки будут повторно инициализированы (с отбрасыванием буферов и т. д.), но fd для ФАЙЛОВ stdio останется прежним после выполнения. - person Nicholas Wilson; 19.11.2012

Вы можете добавить это к своей команде: " > /dev/null 2>&1"

Таким образом, ваша команда становится: service [имя_службы] перезапуск > /dev/null 2>&1

Это означает, что он перенаправляет stderr на стандартный вывод (2>&1) и перенаправляет стандартный вывод на /dev/null ( > /dev/null)

person Mohamed Tarek    schedule 19.11.2012