Domanda

Leggendo il href="http://www.kernel.org/doc/man-pages/online/pages/man2/sendfile.2.html" rel="nofollow uomo del Linux chiamata di sistema sendfile , mi chiedo se sia possibile per il programma chiamando per sapere quando in_fd è a EOF. Presumibilmente, questo potrebbe essere segnalata da un valore di ritorno di 0, ma questo porta alla domanda di ciò che un valore restituito di 0 indica effettivamente. Se sendfile è come write , quindi un valore di ritorno di 0 sarebbe solo significa che 0 byte state copiate. Ma, se sendfile è come read , quindi un valore di ritorno di 0 significherebbe EOF. Uno deve sapere in anticipo quanti byte che devono essere copiati dalla in_fd a out_fd per uso sendfile? Cosa significa quando sendfile restituisce 0?

È stato utile?

Soluzione

Io non credo che ci sia alcun modo diretto per sapere che, ma non dovrebbe importa. Normalmente si dovrebbe trovare la dimensione del file di input tramite stat/fstat e l'uso che per contare il vostro trasferimento. La fine presa non sta per importa a voi.

L'unica situazione questo dovrebbe essere problematico è che se si desidera trasferire un file che è in crescita o in calo. Dato che il file di input deve essere mmap-ed, e le cose cattive che possono accadere (senza un codice intelligente) con mmap in quelle situazioni si dovrebbe probabilmente solo non impiegare sendfile per questi casi.

Altri suggerimenti

è possibile utilizzare il parametro di offset per il conteggio di lettura.

Secondo la pagina man

Se offset non è nullo, quindi punta a una variabile tenendo l'offset da cui sendfile del file () inizierà la lettura dei dati da in_fd. Quando sendfile rendimenti (), questa variabile verrà impostato l'offset del byte successivo all'ultimo byte che è stato letto. Se offset non è nullo, quindi sendfile () non modifica il file corrente di offset di in_fd; altrimenti il ??file corrente viene regolata di offset per riflettere il numero di byte letti dal in_fd.

count è il numero di byte da copiare tra i descrittori di file.

VALORE DI RITORNO        Se il trasferimento ha avuto successo, viene restituito il numero di byte scritti out_fd. In caso di errore, viene restituito -1, e errno è impostata in modo appropriato.

e sì che i mezzi restituiscono il valore 0 significa che nessun dato copiati alla presa di scrittura.

Si può assumere EOF è stato raggiunto quando l'allora numero di byte inviati è 0:

sent = sendfile(out_fd, in_fd, &offset, nbytes);
if (sent == 0) {
    // EOF
    ...
}

Questa assunzione funziona anche in caso di non bloccanti.

nel mio caso, incontrano il file essere troncato da rsync, l'uso di app sendfile al file di trasmissione nello stesso tempo. Trovo l'applicazione mangiare CPU al 100% nella condizione, posso risolvere il mio codice si riferisce l'articolo seguito, la questione scomparire. http://www.linuxjournal.com/article/6345

il punto è l'uso F_SETLEASE ottenere il file affitta per la tua app.

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