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?

È stato utile?

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.

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