Czy istnieje sposób przekierowania standardowego wyjścia procesu w konsoli Win32 na nazwany potok ? Nazwane potoki są wbudowane w Windows i chociaż byłyby użyteczną koncepcją, nigdy nie widziałem ich z linii poleceń.
To znaczy. jak example.exe >\\.\mypipe
. (Ta składnia może nie być poprawna, ale masz rację.) Chciałbym móc przekierować stdout i stderr do różnych potoków w tym samym czasie.
Chciałbym uniknąć używania plików fizycznych jako substytutu, aby uniknąć radzenia sobie z powolnością IO, buforami IO, blokadami plików, prawami dostępu, dostępnym miejscem na dysku twardym, decyzją o nadpisaniu, niezmienną trwałością itp.
Innym powodem jest to, że tradycyjny zestaw narzędzi systemu Windows nie jest zaprojektowany w oparciu o filozofię (tekstową) opartą na plikach, tak samo jak w Uniksie . Również nazwanych rur nie można łatwo zamontować w systemie Windows, jeśli w ogóle.
Wreszcie istnieje ciekawość, czy dobry pomysł mógłby zostać dobrze wykorzystany.
źródło
Odpowiedzi:
Nie jestem pewien, dlaczego nie chcesz przekierowywać do pliku. Istnieją dwie metody, które tutaj przedstawię. Jedną z metod jest przekierowanie do pliku i odczyt z niego, drugi to zestaw programów.
Nazwane rury
To, co zrobiłem, to napisanie dwóch programów dla .NET 4. Jeden wysyła wyjście do nazwanego potoku, drugi odczytuje z tego potoku i wyświetla na konsoli. Użycie jest bardzo proste:
W innym oknie konsoli:
Niestety, może to tylko przekierować
stdout
(lubstdin
połączyć), a niestderr
samo, z powodu ograniczeń w operatorze potoku (|
) w wierszu polecenia systemu Windows. Jeśli dowiesz się, jak wysłaćstderr
za pośrednictwem tego operatora, powinien działać. Alternatywnie serwer można zmodyfikować, aby uruchomić program, a konkretnie przekierowaćstderr
. Jeśli to konieczne, daj mi znać w komentarzu (lub zrób to sam); nie jest to zbyt trudne, jeśli masz wiedzę o bibliotece „Proces” C # i .NET.Możesz pobrać serwer i klienta .
Jeśli zamkniesz serwer po połączeniu, klient natychmiast się zamknie. Jeśli zamkniesz klienta po połączeniu, serwer zamknie się, gdy tylko spróbujesz coś przez niego wysłać. Ponowne podłączenie uszkodzonej rury nie jest możliwe, głównie dlatego, że nie mogę się teraz martwić robieniem czegoś tak skomplikowanego. Jest również ograniczona do jednego klienta na serwer .
Kod źródłowy
Są one napisane w C #. Nie ma sensu tego tłumaczyć. Korzystają z .NET NamedPipeServerStream i NamedPipeClientStream .
Serwer:
Klient:
Przekierowanie do pliku
stderr
dane wyjściowe do tego plikuZapewnia to pożądany efekt jednego okna konsoli do oglądania
stdout
(i udostępnianiastdin
), a drugiego do oglądaniastderr
.Wszystko, co naśladuje
tail
, zadziałałoby. Metoda PowerShell działa natywnie w systemie Windows, ale może być nieco powolna (tzn. Istnieje pewne opóźnienie między zapisaniem pliku a wyświetleniem na ekranie). Zobacz to pytanie StackOverflow dla innychtail
alternatyw.Jedynym problemem jest to, że plik tymczasowy może być dość duży. Możliwym obejściem jest uruchomienie pętli, która drukuje tylko wtedy, gdy plik ma zawartość i natychmiast wyczyści plik, ale spowoduje to sytuację wyścigu.
źródło
Dziwię się, że odpowiedź na to pytanie już nie została poprawna. W systemie istnieje ścieżka UNC przypisana potokom nazwanym, dostępna na każdej maszynie w sieci, która może być używana jak zwykły plik:
Zakładając, że na tym komputerze istnieją rury o nazwie „StdOutPipe” i „StdErrPipe”, próbuje się połączyć i zapisać do nich.
pipe
Częścią jest to, co określa, że chcesz nazwanego potoku.źródło
Nie ze standardową powłoką (CMD.EXE). Dla programistów jest to dość łatwe . Po prostu złap dwie rury procesu, który rozpocząłeś.
źródło
Twoje preferencje dotyczące potoku danych Windows z serwera do okna dos klienta, natychmiast lub później, mogą być spełnione z małym dyskiem RAM. Ta sama pamięć jest przydzielana do danych, zapisywana / odczytywana z nazwą podobną do systemu plików. Klient usuwa zużyty plik i czeka na inny lub pozostawia go, aby zniknął po wyłączeniu komputera.
źródło