Как передать NULL в стандартный ввод, как этот код Perl? - PullRequest
1 голос
/ 18 марта 2010

Это мой вопрос и, очевидно, Это ответ . Оказывается, это была проблема с буфером (решение в принятом ответе моей ссылки ffmpeg), а не stdin. Я обнаружил, что вы можете вывести stdout в null, написав> NUL в командной строке, поэтому я попытался написать

Как мне передать значение null или сделать что-то с блокировками ввода-вывода, как это делает Perl-код, чтобы мой скрипт ffmpeg не блокировался примерно через 15 секунд? ПРИМЕЧАНИЕ: я должен получить стандартный вывод и ошибку для проверки на сбои.

1 Ответ

3 голосов
/ 18 марта 2010

Обновление: Предыдущий ответ был о том, как закрыть стандартный ввод для процесса, порожденного из Perl, но вопрос на самом деле о том, как выполнить задачу в .NET.

Идея та же. Вы хотите закрыть дескриптор стандартного потока ввода нового процесса. В .NET это можно сделать с помощью

app.StandardInput.Close()

сразу после звонка на app.Start().

(я думаю, вы также захотите установить app.StartInfo.RedirectStandardInput = true, но я не большой программист .NET и не уверен в этом).


NUL - это соглашение Windows, подобное Unix /dev/null. Но в Unix > NUL создаст файл с именем "NUL", а < NUL вызовет сбой вашего системного вызова (т. Е. system, backticks и т. Д.), Если не будет файла с именем "NUL".

Тем не менее, в Perl есть переносимые способы закрытия стандартного ввода для порожденного процесса. Например:

open $fh, "| $command > outputfile 2> errorfile";
close $fh;

запустит $command и сразу закроет стандартный дескриптор ввода $command, как если бы вы запустили команду из командной строки и сразу нажали ^D.

...