我已經在C中使用系統調用(打開,讀取和寫入)來模擬Linux系統中的「cat」函數,並且它比真實的函數慢...與Linux的「貓」相比,爲什麼我的系統調用的「貓」功能比較慢?
我正在使用相同的緩衝區大小作爲真正的「貓」,並使用「strace」我認爲這是做相同數量的系統調用。但是我的「貓」的輸出比真正的「貓」慢了一點。
這是我的代碼:我從文件中讀取
#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;
}
(即我傳遞作爲參數主,我覺得這裏不需要代碼)比我所說的catPrint()函數與該文件描述符和1輸出描述符,所以它打印到標準輸出。
我不明白爲什麼它比較慢,因爲我使用相同的文件進行測試,並且兩者(真正的「貓」和我的)只有一個read()和一個write()作爲整個文本。整個文字是不是應該出現在屏幕上?
P.S:我已經把這個標記爲家庭作業,雖然我的問題在這裏(爲什麼它比較慢)不是作業的一部分。我只需要使用系統調用來創建一個「貓」類型的函數,完成。我只是對我的代碼感興趣,這有點慢。
問題愚蠢解決FROM ME:
我決定打電話給linux的原貓幾次在同一個文件,一前一後,我才意識到,這也減緩了一些時代的我叫它,就像我自己一樣慢。我想一切都很好...
對不起,浪費你的時間這樣的人。
恕我直言,`家庭作業`標籤是誤導。你的問題涉及一個有趣的背景事實。 「家庭作業」意味着無論是繁瑣的初學者工作還是(在量表的另一端)一個測驗問題。 – 2009-04-20 18:44:37
如果在第二次寫入()時發生錯誤,則錯誤(即,寫入返回-1)處理不正確。 – jpalecek 2009-04-20 18:50:43
如果你認爲它更好,你可以刪除作業標籤...你是什麼意思jpalecek?只有一個寫(如在系統調用中)我只有一個輔助功能。如果該輔助函數中的write()失敗,我需要將-1一直返回到調用catPrint()的地方...... – 2009-04-20 19:00:33