Mi chiedo se esiste un equivalente di Windows per Linux mkfifo. Per equivalente, intendo il modo di creare file, con st_mode S_IFIFO. Grazie per le risposte.File Fifo Esempio di Windows
risposta
Dovrebbe essere possibile emulare il comportamento mkfifo
in una certa misura. Ho implementato qualcosa del genere molti anni fa per OS/2 che è abbastanza simile a WinXX rispetto al file system.
La limitazione principale è che Windows utilizza i nomi di file riservati per tubi:. \\ \ pipe \ pipename o \\ servername \ pipe \ pipename sulla rete (che può essere molto utile). Ma non sarà possibile utilizzare direttamente nomi arbitrari di fifo. I nomi delle pipe richiedono il prefisso \\. \ Pipe \.
Tuttavia, un'applicazione può creare una pipe con CreateNamedPipe
con PIPE_ACCESS_DUPLEX
e ad es. un nome GUID e crea un collegamento simbolico a questa pipa nella directory di destinazione con DeviceIoControl
/FSCTL_SET_REPARSE_POINT
. Questo dovrebbe essere abbastanza vicino a mkfifo
.
Lo svantaggio è che l'applicazione che fornisce servizi alla pipe deve essere eseguita finché esiste l'istanza di pipe. E, naturalmente, dovrebbe pulire il collegamento simbolico al termine. Inoltre ha bisogno di leggere tutti i dati dalla pipe e scriverlo di nuovo. Non sono sicuro se questo può essere implementato con zero copie.
Ci sono alcuni altri aspetti. Per esempio. se vuoi essere in grado di eliminare il tuo FIFO emulato, devi tracciare la cancellazione del collegamento simbolico e terminare il processo di lavoro in questo caso.
Mi dispiace, non ho un ambiente di sviluppo Windows, quindi non posso testare questo approccio.
grazie per la risposta. Non stavo davvero cercando di creare questo tipo di file. Ho chiesto perché su sistemi Linux, il driver ntfs-3g in realtà riconosce alcuni file nella partizione NTFS come FIFO \ SOCKET. E la lettura da tale file si blocca inaspettatamente. È la caratteristica del driver FUSE di ntfs-3g. '> fsutil file di createnew fifo 0 > fsutil file di socket createnew 1 > attrib + S -H FIFO > attrib + S -H socket' –
Ho cercato di creare un collegamento simbolico a un percorso che cominci con' \\ . \ pipe' e non riuscivo a farlo funzionare. Vedi [questo] (https://superuser.com/questions/1265561/create-a-symbolic-link-to-a-named-pipe) domanda. – IllidanS4
- 1. Scrittura su FIFO FILE, Linux & Mono (C#)
- 2. fifo - lettura in loop
- 3. Scrivi su fifo (named pipe)
- 4. Esempio di coda seriale GCD semplice come FIFO utilizzando i blocchi
- 5. Unix FIFO in go?
- 6. Haskell: FIFO monad
- 7. Coda FIFO seriale NSOperationQueue
- 8. Esempio di Windows Identity Foundation applicazione MVC
- 9. Classe FIFO in Java
- 10. Come evitare l'eco che chiude le pipe denominate FIFO? - Comportamento divertente dei FIFO di Unix
- 11. Impossibile scrivere nel file FIFO mouted via NFS
- 12. Connessione client-server FIFO corretta
- 13. Implementazioni coda basate su FIFO?
- 14. FIFO Mappa con limitati elementi
- 15. Coda seriale FIFO tramite GCD
- 16. Esempio di perdita di descrittore di file?
- 17. Esempio di caricamento file Silverlight molto semplice
- 18. Esempio di espansione ritardata nel file batch
- 19. Esempio di lettura/scrittura file con NSFileHandle
- 20. Corrispondenza file avanzata di Windows
- 21. Tipo di dati Python per una lunghezza fissa FIFO
- 22. Come garantire la coda blu FIFO
- 23. Forza i file recenti di emacs usando recentf per ignorare i file specificati (.windows e .revive per esempio)
- 24. Autenticazione file eseguibile di Windows
- 25. File mappati memoria di Windows
- 26. Esempio di threading semplice esempio
- 27. Generazione di file casuali in Windows
- 28. Esempio di gridview nidificato
- 29. Buffer FIFO/coda specializzato in flussi di byte
- 30. Mantenimento di un FIFO leggibile attraverso diverse esecuzioni
Windows non ha l'astrazione di "tutto è un file", è necessario accontentarsi di una named pipe. Trovarlo di nuovo per nome dallo spazio dei nomi dell'oggetto kernel non è un problema. –
Mi sto solo chiedendo perché Windows ha definito _S_IFIFO, ma forse è definito solo per alcune compatibilità all'indietro. Anche ntfs-3g (da linux) riconosce alcuni file come S_IFIFO. –
Hmm, hai trovato che in stat.h, un'intestazione che Microsoft ha dovuto emulare. Tecnicamente possibile avvolgendo un handle di named pipe, non è ancora un file. –