2015-07-25 20 views
13

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

+0

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. –

+0

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. –

+0

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. –

risposta

2

Dovrebbe essere possibile emulare il comportamento mkfifoin 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.

+0

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' –

+0

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