Domanda

desidero eseguire riga di comando applicazione arbitraria e leggere il suo standard output come ottiene prodotto. Uso CreateNamedPipe per creare un tubo e quindi fornire altra estremità (aprire CreateFile usate) al CreateProcess. A condizione che il processo di destinazione non manipola esplicitamente il buffer di uscita standard c'è un modo per assicurarsi che il tubo in questione è unbufferred o almeno che il minimo sistema è utilizzato come dimensione del buffer?

È stato utile?

Soluzione

Non si può davvero controllare le dimensioni del buffer. È possibile passare in lettura e scrittura dimensioni del buffer di 1 a CreateNamedPipe , ma il kernel aumenterà automaticamente quelle dimensioni del buffer. Fondamentalmente, il buffer sarà sempre almeno grande come la più grande quantità di dati che è stato pronto a leggere in un dato momento. In altre parole, più velocemente si risponde ad essere disponibili i dati, e il più piccolo dei blocchi di dati scritti al tubo, il più piccolo è il buffer di rimarrà.

  

Le dimensioni di ingresso e di uscita del buffer sono consultivo. La dimensione effettiva del buffer riservato a ciascuna estremità del tubo denominata sono forniti dal default del sistema, il sistema minima o massima, o la dimensione specificata arrotondato al successivo limite di assegnazione. ... Ogni volta che si verifica un'operazione tubo di scrittura, il primo sistema tenta di caricare la memoria sul contingente tubo scrittura. ... Se la quota restante tubo di scrittura è troppo piccolo per soddisfare la richiesta, il sistema cercherà di espandere il buffer per accogliere i dati utilizzando pool non di paging riservata per il processo.

Tuttavia, non credo che le dimensioni del buffer sono molto importanti. Tubi non ritardare l'invio dei dati fino a quando il buffer è "pieno", e non c'è niente equivalente all'opzione "Nagle" per TCP, in modo da mantenere una piccola dimensione del buffer non migliorerà la latenza.

Tieni presente che quando si collega un tubo per stdout di un'applicazione console, l'uscita è tipicamente tamponato da tale applicazione prima è scritto al tubo. Se si desidera che l'uscita senza buffer, è necessario utilizzare stderr.

Inoltre, qualcosa a cui prestare attenzione quando si utilizza il tubo ereditato gestisce è che l'applicazione ha generato erediterà tutte le maniglie, quindi se avete un file o un socket aperto, generare un'applicazione, quindi chiudere quella maniglia, il file / presa / etc. rimarrà aperta fino a quando il processo figlio generato ferma, che può portare a violazioni di condivisione inaspettati e altri problemi strani.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top