При копировании файлов извлекается перо - PullRequest
1 голос
/ 17 января 2012

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

Архитектура устройства: ARM, платформа Linux

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

 sprintf(str, "cp %s%s /mnt/disk/.;sync", FILE_OP_PATH, name);
 96                 system(str);

Ответы [ 4 ]

4 голосов
/ 17 января 2012

Что ж, системные вызовы, которые вы выполняете (прямо или косвенно через стандартную библиотеку), не будут работать, если исходное устройство внезапно пропадет.

Если вы используете простой старый <a href="http://linux.die.net/man/2/read" rel="nofollow">read()</a> для чтения с USB-накопителя, я ожидаю, что он потерпит неудачу, и установите errno на EIO, как указано в документации:

Это также может произойти при низкоуровневой ошибке ввода-вывода при чтении с диска или ленты.

То, что привод принудительно отключен в середине чтения, для меня звучит как «ошибка ввода-вывода низкого уровня».

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

1 голос
/ 17 января 2012

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

Это будет ожидаемый метод операций или более редкое ошибочное событие?

Если это тестовый пример, просто убедитесь, что ваш код не взрывается, или делайте другие странные вещи, такие как бесконечный цикл, повторяющий запись. Файловая система на устройстве также может быть оставлена ​​в нечистом состоянии, так как вы говорите по USB, я думаю VFAT. Неверный размер файла может быть указан.

0 голосов
/ 17 января 2012

Вы можете использовать и настроить udev, чтобы получать уведомления, когда что-либо подключено или отключено от порта USB.

0 голосов
/ 17 января 2012

Хотя мое решение медленное, вы можете попробовать if(fopen("myfile", "r")!=NULL) каждый скопировать:)

...