Как отменить вывод системной команды?

Недавно я написал этот код для выполнения системной команды на C. Я просто хочу измерить время, выполняемое этой системной командой.

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

#include <stdio.h>
int main(int argc, char* argv[])
{
    system("ls");
    return 0;
}

Как отменить вывод системной команды?


person user9179677    schedule 05.01.2018    source источник
comment
Если вы не хотите, чтобы результат был напечатан, куда вы хотите, чтобы они попали?   -  person JawguyChooser    schedule 06.01.2018
comment
Какой вообще смысл перечислять файлы с ls? Весь смысл запуска ls состоит в том, чтобы вывести на терминал список файлов и папок. Если вы не хотите этого делать, не запускайте ls. Это проблема XY — я делаю что-то не так, чтобы что-то сделать, но теперь это вызывает у меня вторую проблему. Как решить вторую проблему? Нет; исправьте первое, а второе исчезнет.   -  person Ken White    schedule 06.01.2018
comment
Если вы хотите получить список файлов в каталоге для работы с ними в вашей программе, используйте тип DIR. См. здесь заголовок stackoverflow.com/questions/612097/   -  person JawguyChooser    schedule 06.01.2018
comment
я просто хочу измерить время выполнения этой системной команды.   -  person user9179677    schedule 06.01.2018
comment
Перенаправить вывод в ›/dev/null   -  person Tony Tannous    schedule 06.01.2018
comment
Часть этого времени приходится на вывод на терминал, так что вы вообще не замеряете время.   -  person Ken White    schedule 06.01.2018
comment
@ user9179677: Почему бы просто не запустить time ls >/dev/null и пропустить перенос? Что делает оболочка в C (кроме добавления накладных расходов за счет изменения запуска одного процесса для ls на три, один для вашей программы, один для оболочки для запуска ls и один для ls)?   -  person ShadowRanger    schedule 06.01.2018
comment
Почему вы хотите запустить системную команду для отображения списка файлов, но не видите, какие файлы перечислены? Я предлагаю //system("ls"); Это занимает 0 времени.   -  person Weather Vane    schedule 06.01.2018


Ответы (2)


Когда вы вызываете system() из C, вызывается оболочка для интерпретации вашей команды. Это означает, что вы можете использовать перенаправления оболочки:

system("ls > /dev/null");

и если вы хотите, чтобы ошибки также подавлялись

system("ls > /dev/null 2>&1");

Однако из-за накладных расходов на запуск оболочки и хрупкости построения команд оболочки лучше избегать system(), когда это возможно.

person RooterTooter    schedule 05.01.2018
comment
системный вызов — это четко определенный термин, который может сбивать с толку в данном контексте. Я думаю, что некоторые обратные кавычки могут помочь: system() звонки - person myaut; 06.01.2018
comment
Действительно лучше избегать system(). Использование им оболочки и особого поведения при обработке сигналов дает ему единственное законное применение: выполнение команды оболочки, запрошенной пользователем (например, через ! в vi). - person Davis Herring; 06.01.2018
comment
@DavisHerring Даже в этом случае, возможно, лучше запустить оболочку входа пользователя вместо /bin/sh, используемой system() - person that other guy; 06.01.2018
comment
Но у моей команды system("chcp 936") нет возможности перенаправить вывод, как? - person Zhang; 04.12.2020

Если вы хотите измерить время с помощью системной команды, вы можете перенаправить standout и stderr в системном вызове. Не уверен, что это самый элегантный, но он работает:

#include <stdlib.h>
#include <stdio.h>
int main() {
    system("ls >/dev/null 2>&1");
}

Обратите внимание, что вам нужны заголовки <stdlib.h> для system.

person JawguyChooser    schedule 05.01.2018
comment
Вы предлагаете перенаправить stdout и stderr, но приведенный вами пример перенаправляет только stdout. - person Turn; 06.01.2018
comment
@ Поверни, ты прав, я отредактировал ответ. Хотя, между прочим, ls на самом деле не должен ничего печатать на stderr;) И мы можем только надеяться, что все, чего пытается достичь OP, не является тем, что нужно масштабировать или учитывать странные крайние случаи, потому что Бог знает этот подход это своего рода сумасшедший в первую очередь. - person JawguyChooser; 06.01.2018