Ich habe diese Funktion in C unter Verwendung von Systemaufrufen erfolgen (öffnen, lesen und schreiben), um die „cat“ Funktion in Linux-Systeme zu simulieren, und es ist langsamer als die reale ...Warum funktioniert meine "Katze" mit Systemaufrufen langsamer als die "Katze" von Linux?
Ich bin mit dem gleichen Puffergröße als die echte "Katze" und mit "strace" Ich denke, es macht die gleiche Menge an Systemaufrufen. Aber die Ausgabe von meiner "Katze" ist ein bisschen langsamer als die echte "Katze".
Dies ist der Code, den ich habe:
#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;
}
Ich bin aus einer Datei zu lesen (die ich als Argument zur Haupt passieren, denke ich, dass Code hier nicht benötigt wird), als ich die CatPrint() aufrufen Funktion mit diesem Dateideskriptor und 1 für den Ausgabedeskriptor, so dass es nach stdout druckt.
Ich verstehe nicht, warum es langsamer ist, weil ich die gleiche Datei zum Testen verwende und mit beiden (dem echten "Katze" und mir) gibt es nur einen read() und einen write() für den ganzen Text. Sollte nicht der ganze Text auf dem Bildschirm erscheinen?
P.S: Ich habe dies als Hausaufgabe markiert, obwohl meine Frage hier (warum es langsamer ist) ist nicht Teil der Hausaufgaben. Ich musste nur die Systemaufrufe verwenden, um eine "cat" -Funktion zu erstellen, was erledigt ist. Ich bin nur fasziniert von meinem Code, der ein bisschen langsamer ist.
PROBLEM MIT STUPIDITY VON MIR GELÖST:
Ich habe gerade beschlossen, Linux ursprüngliche Katze ein paar Mal auf der gleichen Datei zu nennen, eine nach der anderen, und ich erkannte, dass es auch einige der Zeit langsam war ich nannte es so langsam wie mein eigenes. Ich denke, alles ist in Ordnung als ...
Entschuldigung für die Verschwendung Ihrer Zeit so Leute.
IMHO, das Hausaufgaben-Tag ist irreführend. Ihre Frage betrifft einen interessanten Hintergrund. "Hausaufgaben" impliziert entweder mühsame Anfängerarbeit oder (am anderen Ende der Skala) eine Quizfrage. –
BTW der Fehler (dh write returning -1) Behandlung ist falsch, wenn der Fehler beim zweiten write() passiert. – jpalecek
Sie können das Hausaufgaben-Tag löschen, wenn Sie denken, es ist besser ... Was meinst du jpalecek? Es gibt nur einen Schreibzugriff (wie im Systemaufruf) Ich habe nur eine Hilfsfunktion. Wenn das write() innerhalb dieser Hilfsfunktion fehlschlägt, muss ich den -1 vollständig zurückgeben, wo catPrint() aufgerufen wurde ... –