Я сделал эту функцию в C, используя системные вызовы (открытые, чтение и запись), чтобы имитировать функцию «cat» в системах Linux, и она медленнее, чем реальная ...Почему моя «кошка» с системными вызовами медленнее по сравнению с «кошкой» 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 для дескриптора вывода, чтобы он печатался на stdout.
Я не понимаю, почему он медленнее, потому что я использую тот же файл для тестирования, и с обоими (реальный «кот» и мой) есть только один read() и один write() для всего текста. Не должен ли весь текст появляться на экране?
P.S: Я отметил это как домашнюю работу, хотя мой вопрос здесь (почему он медленнее) не является частью домашней работы. Мне нужно было использовать системные вызовы для создания функции типа «cat», которая выполняется. Я просто заинтригован своим кодом, который немного медленнее.
задача, решаемая с глупостью ОТ МЕНЯ:
Я просто решил назвать оригинальный кот в Linux несколько раз на тот же файл, один за другим, и я понял, что это также замедлять некоторые времена я называется так же медленно, как и моя. Я думаю, все в порядке, чем ...
Извините за то, что тратили свое время, как этот человек.
IMHO, тег 'homework' вводит в заблуждение. Ваш вопрос касается интересного фона. «домашняя работа» подразумевает либо утомительную работу новичков, либо (на другом конце шкалы) вопрос викторины. –
BTW ошибка ошибки (т. Е. Запись возвращаемого -1) неверна, если ошибка возникает во второй записи(). – jpalecek
Вы можете удалить тег домашней работы, если считаете, что это лучше ... Что значит jpalecek? Есть только одна запись (как в системном вызове) У меня есть только вспомогательная функция. Если функция write() внутри этой вспомогательной функции терпит неудачу, мне нужно вернуть -1 до того момента, когда была вызвана catPrint() ... –