Bir çeşit böyle bir yönlendirildi stdin
borudan verilerini alır Windows C program var:, yeniden yönlendirilmiş bir boru olan engelleyici olmayan stdin nasıl?
./some-data-generator | ./myprogram
Sorun engellenmeyen bir şekilde stdin
okumak gerekiyor olmasıdır. Bunun nedeni, (1) girişin bir veri akışı olmasıdır ve EOF
yoktur ve (2) programın herhangi bir zamanda stdin
-reading iş parçacığını iptal edebilmesi gerekir. Hiçbir veri olmadığı zaman fread
bloklar, bu çok zor hale getirir.
Unix'te, bir dosya tanımlayıcısının engelleme modunu fcntl
ve O_NONBLOCK
ile ayarlayabildiğinizden, bu hiç sorun değil. Ancak, Windows'ta fcntl
bulunmuyor.
DWORD mode= PIPE_READMODE_BYTE|PIPE_NOWAIT;
BOOL ok= SetNamedPipeHandleState(GetStdHandle(STD_INPUT_HANDLE), &mode, NULL, NULL);
DWORD err= GetLastError();
ama bu ERROR_ACCESS_DENIED
(0x5
) başarısız:
SetNamedPipeHandleState
kullanarak çalıştı.
Başka ne yapacağımı bilmiyorum. Bu aslında imkansız mı (!) Yoksa sadece yüksek gizlenmiş mi? Net üzerindeki kaynaklar bu konu için oldukça seyrek.
PeekNamedPipe, aradığım şeydi ... Bu, ReadFile öğesini çağırmanıza izin vermez, böylece engellenmez. – paleozogt