Determinare se un descrittore di file leggibile è la fine di lettura di un tubo
-
30-09-2019 - |
Domanda
Vorrei utilizzare splice
ai dati pari a zero-copy da STDIN_FILENO
a un file descrittore (che potrebbe essere quello di un normale dispositivo di file, char o il blocco, FIFO, o qualsiasi cosa che può essere aperto con open
). Per uso splice
, sia il da descrittore di file o descrittore di file deve essere l'estremità appropriata di un tubo, così generalmente un tubo viene creata per servire come un buffer intermediario quando il programmatore vuole zero copiare i dati da non-pipe a non-pipe. Tuttavia, se è già STDIN_FILENO
fine di lettura di un tubo, quindi ho potuto saltare questo passo e tentare di giunzione direttamente dal STDIN_FILENO
all'altra descrittore di file. Pertanto, vorrei essere in grado di determinare se STDIN_FILENO
è la fine di lettura di un tubo.
C'è una chiamata di sistema Linux che può determinare se STDIN_FILENO
è la fine di lettura di un tubo?
Soluzione
Per ottenere informazioni su un fd aperta, è possibile utilizzare fstat (). Direi che st_mode del risultato dovrebbe essere S_IFIFO per un tubo. In alternativa, / proc / self / fd / e / proc / self / fdinfo / anche fornire alcune informazioni su un descrittore di file. Tenete a mente che / proc è specifico per Linux.
Tuttavia, penso che potrebbe essere più facile da provare solo per uso splice () prima e se non riesce (con EINVAL?) Ricadere la tua magia.
Altri suggerimenti
In alternativa, lseek()
fallirà con ESPIPE
se "fd è associato con un tubo, presa, o FIFO." Quindi un lseek(fd, 0, SEEK_CUR)
no-op vi dirà se il descrittore di file è uno di questi.
Nella mia situazione, Copre tutti i casi mi interessava.