2009-08-10 13 views
5

A livello abbastanza alto nella funzione Linux write(), filtra le richieste per la scrittura di buffer di lunghezza 0. Il che ha senso. Chi vorrebbe che il sistema operativo sprechi il suo tempo scavando attraverso i livelli solo per determinare che non c'è lavoro da fare?Quali sono le conseguenze del chiamare write() con lunghezza zero?

Beh ... io.

È correlato a questo question; e la scoperta che il driver I2C bit-banged darà un codice di ritorno potenzialmente utile se l'indirizzo (inviato sul bus prima dei dati) darà un errore se l'handshaking è sbagliato.

Uno potrebbe inviare dati fittizi dopo l'indirizzo, ma non con il dispositivo che sto utilizzando. (Forse proverò a leggere ...).

Quindi la domanda è: Che tipo di inferno si scatenerà se il kernel dovesse consentire zero (0) scritture di lunghezza?

risposta

2

Solo per motivi di chiusura, vado con l'idea di Warren Young di aggiornare il driver e pubblicare la patch (quando ottengo un round tuit).

+0

E questo aiuterà il resto di noi alla fine. Grazie –

0

non una risposta seria: si potrebbe ottenere un programma come touch: P

1

Molto poco, mi piacerebbe pensare - potrebbe essere possibile che una scrittura di lunghezza zero bloccherebbe se il buffer è iscritto a ha zero spazio disponibile, in alcuni driver. Disabilitare le scritture a lunghezza zero potrebbe rendere le cose più semplici in casi come quello - oltre a evitare un sacco di lavoro sprecato.

Perché non rimuoverlo e vedere che tipo di inferno si scatena? :)

5

Quello che stai descrivendo equivale essenzialmente allo stesso tipo di male che infetta diverse API di Windows che richiedono quantità di memoria imprevedibili. La pratica è di chiamarli senza buffer per inserire il loro lavoro, fanno comunque il lavoro, senza memorizzare i risultati, ma contando il numero di byte di cui avrebbero bisogno lungo la strada. Quindi si assegna un buffer di quella dimensione e si chiama di nuovo la funzione con il buffer, conoscendo la dimensione.

Questo è indescrivibilmente malvagio. È l'equivalente di programmazione computerizzata di una burocrazia decaduta, in cui ogni dipartimento richiede di compilare un modulo che contiene la maggior parte delle stesse informazioni di quello che hai fornito al dipartimento precedente, ma dal momento che ci sono informazioni diverse su ogni modulo, non prenderanno solo una copia del modulo che hai dato agli altri ragazzi. Ptui!

Il tempo del programmatore è costoso, il tempo della CPU è economico. Richiedere ai programmatori di scrivere la stessa chiamata API N volte per scoprire uno stato mondiale che l'API stessa potrebbe risolvere autonomamente per capovolgerlo.

Le migliori pratiche, quindi, è fare in modo che l'autista faccia tutto il possibile per assicurarsi che il proprio write() abbia esito positivo. Se è possibile prevedere in anticipo che non può avere successo controllando alcuni stati del mondo, forse dovrebbe essere un ioctl().

+0

1 soluzioni alternative hardware appartengono al kernel ... ma se non lo fa, e questo è un kernel molto vecchio (non mantenuto), allora potrebbe essere ragionevole risolvere il problema in userspace. – bdonlan

+0

Ma in questo caso in realtà non voglio scrivere - quindi l'analogia di Windows non è applicabile. Io _really_ voglio 'scrivere' zero byte. In caso contrario, ho intenzione di modificare l'API aggiungendo chiamate ioctl proprietarie a un driver stabilito. – Jamie

+3

Non penso che * dovresti * aggiungere una chiamata proprietaria al driver. Penso che dovresti indirizzare questo comportamento alla persona che mantiene il driver, e chiedere loro - o fornire loro una patch - esponendo questa funzionalità. Potrebbe essere chiamata la funzione I2C_PING. ioctls() sono un modo per farlo./proc e sysctl sono altri. –

0

Mi viene il brivido di suggerire un ioctl() ma non sarebbe un'interfaccia migliore per ottenere informazioni sullo stato dell'interfaccia?

0

Cosa significherebbe scrivere a lunghezza zero? In generale, scrivere significa trasferimento di dati ... e sono sicuro che altri problemi potrebbero essere causati dal non verificarlo e in questo modo catturare la maggior parte di input non validi per i driver.y

se si tratta di una chiamata "fai da te" di un solo bit di informazione, penso che ioctl sia la strada da percorrere. Non è carino, ma cosa puoi fare?

In alternativa, prendere l'opzione nucleare, utilizzare mmap() e spostare l'intera cosa nello spazio utente. Basso overhead, e puoi scrivere codice poke classico come "scrivere X in questo registro" che sembra quasi quello di cui hai bisogno.

Problemi correlati