У вас есть две опции:
Во всех конструкторах класса добавьте экземпляр в контейнер в статическом хранилище.
Сделайте конструкторы класса приватными и напишите фабричную функцию, которая создает объект с помощью приватного конструктора и добавляет объект в контейнер. Этот подход может быть реализован с использованием нестатического контейнера.
В вашем посте упоминается попытка 1. безуспешно. Подход оправдан - вы допустили ошибку, , но вашего описания недостаточно, чтобы мы могли сказать, что это за ошибка. Strike> Учитывая новую информацию, кажется, что вы не смогли определить статический вектор.
Возникает вопрос, как бороться с уничтожением объекта. Предположительно объект должен быть удален из контейнера. Это один из немногих случаев, когда связанный список может быть решением. Если вы сохраните итератор в элементе списка внутри самого объекта, то этот объект может удалить себя из списка после уничтожения.
man readom
, программа, которая идет с cdrecord:
-noerror
Do not abort if the high level error checking in readom found an
uncorrectable error in the data stream.
-nocorr
Switch the drive into a mode where it ignores read errors in
data sectors that are a result of uncorrectable ECC/EDC errors
before reading. If readom completes, the error recovery mode of
the drive is switched back to the remembered old mode.
...
retries=#
Set the retry count for high level retries in readom to #. The
default is to do 128 retries which may be too much if you like
to read a CD with many unreadable sectors.
При проверке, ли hdparm
мог изменить количество повторений (не кажется так), я думал, что, в зависимости от типа ошибки, понижая скорость CD-ROM мог потенциально сократить количество ошибок чтения, которые могли на самом деле увеличить среднюю скорость чтения. Однако, если некоторые секторы будут абсолютно нечитабельны, то даже понижение скорости CD-ROM не поможет.
Лучший доступный инструмент является dd_rhelp. Просто
dd_rhelp /dev/cdrecorder /home/myself/DVD.img
, возьмите чашку чая и смотрите на хорошую графику.
dd_rhelp информация о RPM-пакете:
dd_rhelp использует ddrescue на Вашем всем диске и пытается собрать максимальные допустимые данные прежде, чем попробовать целую вечность на badsectors. Если Вы оставляете работу dd_rhelp в течение бесконечного времени, она имеет подобный эффект как простой dd_rescue. Но потому что у Вас не может быть этого бесконечного времени, dd_rhelp перепрыгивает через поврежденные секторы, и спасите допустимые данные. В конечном счете это анализирует все Ваше устройство с dd_rescue.
Вы можете Ctrl-C это каждый раз, когда Вы хотите и повторно выполняетесь - это по желанию, dd_rhelp возобновляет задание, поскольку это зависит от файлов журнала dd_rescue, создает. Кроме того, прогресс показывают в изображении ASCII Вашего спасаемого устройства.
Я использовал его много сам, и очень, очень realiable.
Можно установить его от DAG до Red Hat как дистрибутивы.
Так как dd был предложен, я должен отметить, что знаю о существовании и использовал sg_dd, но мой вопрос не был о командах (1) или (1m), а о системных вызовах (2) или библиотеки (3).
Другая утилита командной строки Linux, которая помогает, sdparm
. Следующий флаг, кажется, отключает аппаратные повторения:
sudo sdparm --set=RRC=0 /dev/sr0
где /dev/sr0
устройство для оптического диска в моем случае.
Так как Вы спрашиваете о доступе уровня драйвера, необходимо изучить команды SCSI или возможно ASPI как API. На программном обеспечении окон VSO (разработчики blindread/blindwrite ниже) разработали намного лучший API, Patin-Couffin, который обеспечивает заблокированный низкоуровневый доступ:
http://en.wikipedia.org/wiki/Patin-Couffin
Это могло бы запустить Вас. Однако в конце дня, с диском соединяют интерфейсом с командами SCSI, даже если это - на самом деле USB, SATA, ATA, IDE, или иначе. Вы могли бы также искать условия, связанные с ATAPI, который был одной из первых спецификаций для этого интерфейса уровня CD-ROM SCSI.
Я был бы удивлен, не могли ли Вы найти подходящую библиотеку Linux или пример контакта с более низкими командами уровня с помощью вышеупомянутых критериев поиска и понятий.
Более старый ответ:
Blindread/blindwrite часто разрабатывался в расцвете схем защиты CD-ROM с помощью намеренно поврежденных секторов или информации об ошибке для проверки исходного CD.
Это позволит, Вы для установки целого убили параметров, включая повторения. Следует иметь в виду, что сам дисковод для компакт-дисков определяет, сколько раз повторить, и я не уверен, что это устанавливаемо с помощью программного обеспечения для многих (большинство?) Дисководы для компакт-дисков.
Можно скопировать диск в формат ISO, игнорируя ошибки, и затем использовать утилиты ISO для чтения данных.
- Adam
Смотрите на интерфейс ASPI. Доступный на обоих окнах и Linux.
dd (1) является Вашим другом.
dd, если =/dev/cdrom of=image bs=2352 conv=noerror, notrunc
Диск может все еще повторить немного, но я не думаю, что Вы доберетесь немного лучше, не изменяя встроенное микропрограммное обеспечение.