Как открыть файл "nul"? - PullRequest
       19

Как открыть файл "nul"?

5 голосов
/ 13 января 2009

Мне нужно создать новый процесс с перенаправленным стандартным потоком ошибок в какой-нибудь файл. Код, из которого создается дочерний процесс, не имеет доступной консоли, поэтому бывают случаи, когда GetStdHandle (любой) вернет 0. По какой-то причине дочерний процесс попытается дублировать все свои стандартные дескрипторы ввода-вывода (исходный код для дочернего процесса недоступен). ) поэтому все его дескрипторы должны быть действительными.

Так что мне нужно запустить этот процесс так же, как его можно запустить из консоли с помощью:

someproc <nul >nul 2>err

Я вижу несколько путей для этого: 1. Создайте две пары труб. Возможно, это хорошее решение, но оно будет слишком сложным для меня. 2. Откройте файл "nul" с помощью вызова функции CreateFile ("nul", ...). Этот вызов не создает никаких файлов, но это тоже выглядит странно. 3. Используйте INVALID_HANDLE_VALUE. Это тоже работает, но я думаю, что могут быть другие проблемы с другими дочерними процессами.

Я считаю, что есть лучшие способы.

Ответы [ 3 ]

6 голосов
/ 13 января 2009

Как изначально было сказано, вы уже ответили на свой вопрос. Чтобы открыть файл "nul", вы просто указываете "nul" при вызове CreateFile. Это выглядит странно, потому что вряд ли кто-то использует это имя файла. (Я не вижу, чтобы он использовался почти так часто, как я вижу /dev/null.) Хотя это совершенно верно.

Но если вы обнаружили, что Invalid_Handle_Value тоже работает, тогда используйте его. Это конечно проще всего. Изначально я не ожидал, что это сработает, поскольку не ожидал, что это будет дублироваться.

2 голосов
/ 13 января 2009

Да, "нул" делает то, что ты думаешь. Если вы перейдете на Unix, это будет "/ dev / null". Напуганное имя - это пережиток дней DOS, наряду с «prn», «com1» и т. Д.

1 голос
/ 13 января 2009

Использование INVALID_HANDLE_VALUE с DuplicateHandle является неправильным: в документации указано, что вам необходим PROCESS_DUP_HANDLE доступ прямо на дескриптор. Вы не имеете этого права на INVALID_HANDLE_VALUE. Устройство NUL (символическая ссылка на /device/null) будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...