Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Andrey Sapozhnikov                   2:5020/400     15 Jul 2003  22:04:30
 To : Konstantin Tokar
 Subject : Re: Как писать в raw device ?
 -------------------------------------------------------------------------------- 
 
 Konstantin Tokar wrote:
 
 > Привет всем неотдыхающим!
 > 
 > Как писать/читать в raw device, например /dev/sda1 , из программы на 
 > перле? Желательно с указанием номера сектора.
 
 Да точно так же как и на C. Аллокируем буфер равный (N+1)*Nsize-1,
 где N - максимальное количество секторов которое хотим записывать
 или считывать за одну операцию, а Nsize - длина сектора в байтах.
 
 C:
 
 #define MAX_SECTORS 8
 #define SECTORSIZE 512
 unsigned char *buffer = malloc((MAX_SECTORS + 1) * SECTORSIZE - 1);
 
 Perl:
 
 use constant MAX_SECTORS => 8;
 use constant SECTORSIZE => 512;
 my $buffer = '\0' x ((MAX_SECTORS + 1) * SECTORSIZE - 1);
 
 Далее надо найти ближайшую к началу позицию в буфере
 адрес которой кратен длине сектора.
 
 C:
 
 int offset = ((unsigned long)buffer % SECTORSIZE) ?
   SECTORSIZE - ((unsigned long)buffer % SECTORSIZE) : 0;
 
 Perl:
 
 use Devel::Peek;
 my $out;
 open(SAVEERR, '>&2') or die "Cannot save stderr: $!";
 close STDERR;
 open(STDERR, '>', \$out);
 Dump($buffer);
 my $pv_address = hex($1) if $out =~ /  PV = 0x([\da-f]+) /;
 close STDERR;
 open(STDERR, '>&SAVEERR') or die "Cannot restore stderr: $!";
 close(SAVEERR);
 my $offset = ($pv_address % SECTORSIZE) ?
   SECTORSIZE - ($pv_address % SECTORSIZE) : 0;
 после чего читаем или пишем используя выровненую часть буффера:
 
 C:
 
 lseek(rawfd, SECTORSIZE * startsector, SEEK_SET);
 read(rawfd, buffer + offset, SECTORSIZE * nsectors);
 
 Perl:
 
 sysseek(RAWFD, SECTORSIZE * $startsector, SEEK_SET);
 sysread(RAWFD, $buffer, SECTORSIZE * $nsectors, $offset);
 -- 
 Андрей
 
 P.S. Открывать устройство в Perl надо, разумеется, через sysopen.
 P.P.S. Вероятно Вам потребуется Perl с поддержкой large files.
 
 --- ifmail v.2.15dev5
  * Origin: Demos online service (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Как писать в raw device ?   Konstantin Tokar   15 Jul 2003 18:21:14 
 Re: Как писать в raw device ?   Andrey Sapozhnikov   15 Jul 2003 22:04:30 
 Re: Как писать в raw device ?   Konstantin Tokar   15 Jul 2003 23:18:28 
 Re: Как писать в raw device ?   Andrey Sapozhnikov   16 Jul 2003 00:46:33 
 Re: Как писать в raw device ?   Konstantin Tokar   16 Jul 2003 01:06:37 
 Re: Как писать в raw device ?   Andrey Sapozhnikov   16 Jul 2003 02:53:42 
 Re: Как писать в raw device ?   Konstantin Tokar   16 Jul 2003 03:04:47 
 Re: Как писать в raw device ?   Artem Chuprina   01 Aug 2003 15:03:33 
 Re: Как писать в raw device ?   Konstantin Tokar   01 Aug 2003 16:58:04 
 Re: Как писать в raw device ?   Andrey Sapozhnikov   01 Aug 2003 19:21:23 
Архивное /ru.perl/6577ff53d620.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional