Есть ли способ получить указатель на ведро? (C / C ++) - PullRequest
3 голосов
/ 25 апреля 2010

Есть ли способ получить указатель на ведро с битами?

Многие системные вызовы ввода-вывода (в частности, связанные с вводом) возвращают данные в буфер определенного размера. Есть ли хитрость или способ сделать указатель сегмента битов сорта, чтобы я мог принять любое количество данных, которые будут выброшены. Делать что-то вроде "char tmp [INT_MAX]" - это безумие. Я ищу поведение, похожее на / dev / null, только в мире указателей.

Не надеяться на это .... просто любопытно.

Спасибо, Chenz

ОБНОВЛЕНИЕ: Возможно, mmap-ing / dev / null. Забыл об этом, когда я задал вопрос.

Ответы [ 7 ]

2 голосов
/ 25 апреля 2010

Какой интерфейс ввода-вывода вы используете? Если это методы на основе файлов (fopen, fread и т. Д.), Вы можете просто продолжать чтение в том же буфере и игнорировать его содержимое. Вы можете делать все что угодно в C / C ++, поэтому то, что вы хотите, безусловно, возможно, но не совсем ясно, что вы пытаетесь сделать. Может опубликовать какой-нибудь код?

1 голос
/ 25 апреля 2010

Если это файл, вы можете пропустить данные при поиске. mmaping / dev / null БУДЕТ выделять и использовать память при записи в область памяти. В любом случае, не совсем понятно, что вы пытаетесь сделать.

1 голос
/ 25 апреля 2010

Я представляю себе только временный массив в стеке, с которым можно читать фиктивные данные. Попытка какого-либо сложного метода, вероятно, сделает недействительными кэши ЦП и снизит производительность.

0 голосов
/ 17 июня 2010

Единственный способ, которым я придумал - это написать какой-нибудь системный вызов, который переключил бы всю виртуальную память в программе в пространство виртуальной памяти другой программы psuedo. Но пространство памяти psuedo будет только для записи и никогда не будет сохранено. Затем вы переключите пространство виртуальной памяти обратно, когда закончите запись в «NULL-указатель».

Пример:

  main() 
  {
    int fd = open("file", O_RDONLY);
    null_vm();
    read(fd, NULL, UINT_MAX);
    unnull_vm();
    close(fd);
    return;
  }

Спасибо, Chenz

0 голосов
/ 25 апреля 2010

Может быть, вы можете искать, куда вы пытаетесь пойти.

0 голосов
/ 25 апреля 2010

Вы можете отобразить одну выделенную страницу на несколько последовательных виртуальных адресов. Но если вы увеличиваете указатель достаточно раз, он в конце концов упадет. Обойти это невозможно, любой указанный вами указатель в конечном итоге будет указывать на что-то важное, если его значение будет увеличено.

Вы будете в лучшей форме, если вызываемый API принимает итератор вместо указателя, потому что вы можете сделать инкремент итератора запретным.

0 голосов
/ 25 апреля 2010

Многие системные вызовы ввода-вывода (в частности, связанные с вводом) возвращают данные в буфер определенного размера.

Обычно этот размер либо небольшой, либо заданный пользователем.

Если это предопределенный небольшой размер, выделите буфер в стеке и проигнорируйте результаты.

Если вы укажете размер, посмотрите, не приведет ли нулевая спецификация размера к игнорированию буфера. Если так, сделай это. Если нет, выделите какой-нибудь небольшой буфер и (при необходимости) повторно вызовите функцию для очистки всех ненужных данных через него.

Возможно, также неплохо написать автора функции и попросить разрешить указатель буфера NULL.

...