Как минимизировать количество системных вызовов? в C

#c #copy

#c #Копировать

Вопрос:

Как минимизировать количество системных вызовов read() и write() в моем коде?

 int copy(char* entry, char* exit){
    char buf; 
    int in; 
    int out; 

    in = open(entry,O_RDONLY);
    out = open(exit ,O_APPEND|O_WRONLY);
    while(read(in, amp;buf, 1) != 0){
        write(out, amp;buf, 1); }

    close(in);
    close(out);
    return 0;

}
  

Комментарии:

1. Используйте больший буфер.

2. Но файл может иметь размер 50, но также может быть 350. Итак, я не знаю, насколько велик установленный буфер, чтобы минимизировать количество вызовов.

3. Буфер может быть произвольной длины. Если 1K байт, то он делит на 1000 количество системных вызовов. Кроме read() того, дает вам количество прочитанных байтов в случае, если оставшиеся для чтения байты меньше ширины буфера.

Ответ №1:

Предполагая, что вы увеличили свой буфер, например, до 256, теперь напишите:

 char buf[256];
int n;
...
while((n=read(in, buf, sizeof(buf))) > 0){
    write(out, buf, n);
}
  

При каждом чтении считывается максимум 256 байт. read возвращает количество прочитанных байтов, поэтому n теперь имеет это число, которое вы записываете. Последнее чтение будет меньше 256, поэтому последняя запись также будет меньше 256.