Ho eseguito questa funzione in C utilizzando le chiamate di sistema (aperto, lettura e scrittura) per simulare la funzione "gatto" nei sistemi Linux ed è più lento di quello reale ...Perché la mia funzione "gatto" con le chiamate di sistema è più lenta rispetto al "gatto" di Linux?
Sto usando lo stesso dimensione del buffer come il vero "gatto" e usando "strace" penso che stia facendo la stessa quantità di chiamate di sistema. Ma l'uscita dal mio "gatto" è un po 'più lenta del vero "gatto".
Questo è il codice che ho:
#define BUFSIZ 32768
int sysWriteBuffer(int fdout, char *buffer, ssize_t readBytes) {
ssize_t writtenBytes = 0;
while(writtenBytes < readBytes) {
writtenBytes += write(fdout,
buffer + writtenBytes, readBytes - writtenBytes);
if(writtenBytes == -1) {
return -1;
}
}
return 0;
}
int catPrint(int fdin, int fdout) {
char buffer[BUFSIZ];
ssize_t readBytes;
do {
readBytes = read(fdin, buffer, BUFSIZ);
if(readBytes == -1) {
return -1;
}
if(sysWriteBuffer(fdout, buffer, readBytes) == -1) {
return -1;
}
} while(readBytes > 0);
return 0;
}
che sto leggendo da un file (che mi passa come argomento di principale, credo che il codice non è necessario qui) che io chiamo il Catprint() funziona con quel descrittore di file e 1 per il descrittore di output, quindi stampa su stdout.
Non capisco perché è più lento perché sto usando lo stesso file per il test e con entrambi (il vero "gatto" e il mio) c'è solo un read() e uno write() per l'intero testo. Non dovrebbe l'intero testo apparire sullo schermo?
P.S: Ho taggato questo come compito a casa anche se la mia domanda qui (perché è più lenta) non fa parte dei compiti. Ho solo bisogno di usare le chiamate di sistema per creare una funzione di tipo "gatto", che è fatta. Sono solo incuriosito dal mio codice che è un po 'più lento.
problema risolto con la stupidità DA ME:
ho appena deciso di chiamare il gatto originale di Linux un paio di volte sullo stesso file, una dopo l'altra, e ho appena capito che era anche rallentare un po 'delle volte mi lo chiamò, lento come il mio. Immagino che tutto vada bene di ...
Scusa per aver sprecato il tuo tempo come questa gente.
IMHO, il tag 'homework' è fuorviante. La tua domanda riguarda un fatto interessante. 'compiti a casa 'implicano il noioso lavoro dei principianti o (all'altra estremità della scala) una domanda a quiz. –
BTW la gestione dell'errore (ad esempio scrittura di ritorno -1) non è corretta se l'errore si verifica nella seconda scrittura(). – jpalecek
Puoi cancellare il tag dei compiti se pensi che sia meglio ... Cosa intendi con jpalecek? C'è solo una scrittura (come nella chiamata di sistema), ho solo una funzione ausiliaria. Se la funzione write() all'interno di quella funzione ausiliaria fallisce, ho bisogno di restituire il -1 fino al punto in cui è stato chiamato catPrint() ... –