функция read

Модератор: Модераторы разделов

Аватара пользователя
ivanr
Сообщения: 177
Статус: эblan
ОС: Debian 4.0

функция read

Сообщение ivanr »

Здравствуйте.
Есть пара вопросов.
Первый.
В двух книгах нашел такие строки, с помощью программ "od" или "hexdump" можно просмотреть содержимое каталога в шестнадцатеричном представлении, то есть, открыть его как файл и вывести содержимое на stdout, что-то вроде "cat dirname",
но когда я попробовал, мне было сказано, что это невозможно, так как это директория.
В связи с этим решил написать небольшую программу, которая, как я предположил, должна вывести на stdout содержимое каталога, как оно есть.
вот программа.

Код: Выделить всё

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <unistd.h>

#define readcount 100000

int main (int argc, char *argv[])
{

    int fd;
    char* buffer;
    int cread;

    fd = dirfd(opendir(argv[1]));

    printf ("%d\n", fd);

    buffer = malloc (readcount);
    if (buffer == NULL) {
        fprintf (stderr, ("can not to allocate of mamory\n"));
        return 0;
    }

    cread = read(fd, buffer, readcount);
        if (cread == -1) {
            fprintf(stderr, ("can't read this directory\n"));
            return 0;
        }

    int c;
    c = 0;
    while (c < cread) {
        c++;
        putchar(*buffer);
        buffer++;
    }
    return 0;
}


Вопрос вот в чем, вообще реально или нет сделать то, что я хочу?

и второй вопрос,
чем отличаются эти объявления

Код: Выделить всё

    char** abuffer;
    char **bbuffer;



    char* cbuffer;
    char *dbuffer;


спасибо
Debian GNU/Linux 4.0
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: функция read

Сообщение Uncle_Theodore »

ivanr писал(а):
30.09.2007 00:36
и второй вопрос,
чем отличаются эти объявления

Код: Выделить всё

    char** abuffer;
    char **bbuffer;



    char* cbuffer;
    char *dbuffer;


спасибо

Первое -- указатель на указатель на переменную типа char. Второе -- указатель на переменную типа char...

Ну, типа, второе -- адрес тети Маши. А первое -- та записная книжка, где записан адрес тети Маши...
Спасибо сказали:
Аватара пользователя
ivanr
Сообщения: 177
Статус: эblan
ОС: Debian 4.0

Re: функция read

Сообщение ivanr »

Uncle_Theodore писал(а):
30.09.2007 00:41
ivanr писал(а):
30.09.2007 00:36
и второй вопрос,
чем отличаются эти объявления

Код: Выделить всё

    char** abuffer;
    char **bbuffer;



    char* cbuffer;
    char *dbuffer;


спасибо

Первое -- указатель на указатель на переменную типа char. Второе -- указатель на переменную типа char...

Ну, типа, второе -- адрес тети Маши. А первое -- та записная книжка, где записан адрес тети Маши...


а есть разница в том, где стоят звездочки?
Вот это одно и тоже
char** buffer
char **buffer
Debian GNU/Linux 4.0
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: функция read

Сообщение Uncle_Theodore »

ivanr писал(а):
30.09.2007 00:43
а есть разница в том, где стоят звездочки?
Вот это одно и тоже
char ** buffer
char **buffer

Для компилятора разницы нет. Для людей считается правильным писать звездочки у переменной, второй вариант.
Спасибо сказали:
Аватара пользователя
ivanr
Сообщения: 177
Статус: эblan
ОС: Debian 4.0

Re: функция read

Сообщение ivanr »

Uncle_Theodore писал(а):
30.09.2007 00:45
ivanr писал(а):
30.09.2007 00:43
а есть разница в том, где стоят звездочки?
Вот это одно и тоже
char ** buffer
char **buffer

Для компилятора разницы нет. Для людей считается правильным писать звездочки у переменной, второй вариант.

спасибо,
а то я уже замучился искать разницу
Debian GNU/Linux 4.0
Спасибо сказали:
Аватара пользователя
ivanr
Сообщения: 177
Статус: эblan
ОС: Debian 4.0

Re: функция read

Сообщение ivanr »

А как насчет первого вопроса?
Debian GNU/Linux 4.0
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: функция read

Сообщение Uncle_Theodore »

ivanr писал(а):
30.09.2007 00:55
А как насчет первого вопроса?

Ну... Честно говоря, я не знаю. А что имеется в виду под "содержимым каталога"? Ведь файлы-то там не записаны одним потоком... Можно, конечно, скриптик какой организовать, чтобы вывалить все файлы в текущей директории одним куском, а потом перевести это дело в хексы... Но зачем?
Спасибо сказали:
Аватара пользователя
ivanr
Сообщения: 177
Статус: эblan
ОС: Debian 4.0

Re: функция read

Сообщение ivanr »

Uncle_Theodore писал(а):
30.09.2007 01:26
ivanr писал(а):
30.09.2007 00:55
А как насчет первого вопроса?

Ну... Честно говоря, я не знаю. А что имеется в виду под "содержимым каталога"? Ведь файлы-то там не записаны одним потоком... Можно, конечно, скриптик какой организовать, чтобы вывалить все файлы в текущей директории одним куском, а потом перевести это дело в хексы... Но зачем?


вот вывод команды ls -lh
drwxr-xr-x 2 ivr ivr 4,0K 2007-09-30 02:03 неозаглавленная папка
папка пуста, но она занимает место на диске, мне интересно, что записано в эти 4 кб
Если записано конечно
Debian GNU/Linux 4.0
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: функция read

Сообщение Uncle_Theodore »

А она пуста? Может, в ней скрытые файлы есть?
А какая файловая система? И какой у нее размер блока?
Спасибо сказали:
specter
Сообщения: 71
ОС: SLED 10

Re: функция read

Сообщение specter »

ivanr писал(а):
30.09.2007 00:36
Здравствуйте.
Есть пара вопросов.
Первый.
В двух книгах нашел такие строки, с помощью программ "od" или "hexdump" можно просмотреть содержимое каталога в шестнадцатеричном представлении, то есть, открыть его как файл и вывести содержимое на stdout, что-то вроде "cat dirname",
но когда я попробовал, мне было сказано, что это невозможно, так как это директория.
В связи с этим решил написать небольшую программу, которая, как я предположил, должна вывести на stdout содержимое каталога, как оно есть.
вот программа.

Код: Выделить всё

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <unistd.h>

#define readcount 100000

int main (int argc, char *argv[])
{

    int fd;
    char* buffer;
    int cread;

    fd = dirfd(opendir(argv[1]));

    printf ("%d\n", fd);

    buffer = malloc (readcount);
    if (buffer == NULL) {
        fprintf (stderr, ("can not to allocate of mamory\n"));
        return 0;
    }

    cread = read(fd, buffer, readcount);
        if (cread == -1) {
            fprintf(stderr, ("can't read this directory\n"));
            return 0;
        }

    int c;
    c = 0;
    while (c < cread) {
        c++;
        putchar(*buffer);
        buffer++;
    }
    return 0;
}


Вопрос вот в чем, вообще реально или нет сделать то, что я хочу?

и второй вопрос,
чем отличаются эти объявления

Код: Выделить всё

    char** abuffer;
    char **bbuffer;



    char* cbuffer;
    char *dbuffer;


спасибо


Насчет звездочек - разницы никакой. В основном зависит от мировосприятия - char* a и char *a - определяется стилем. Первый больше намекает на тип, второй на переменную, с точки зрения компилятора и стандарта - одинаково. Теперь насчет программы - ты используешь read - это низкоуровневая функция и подозреваю она читает не список подкаталогов а что-то другое. Что - не знаю, скорее всего то, что лежит за адресом, возвращаемым dirfd. Т.е. абракадабру из файловой системы (фактически ты чиатешь содержимое /dev/hdX начиная с "точки" обозначенной твоей директорией).
Спасибо сказали:
Аватара пользователя
ivanr
Сообщения: 177
Статус: эblan
ОС: Debian 4.0

Re: функция read

Сообщение ivanr »

Uncle_Theodore писал(а):
30.09.2007 02:04
А она пуста? Может, в ней скрытые файлы есть?
А какая файловая система? И какой у нее размер блока?

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

цитата из книги "программное окружение unix"
Брайан Керниган Роб Пайк

"Каталоги, несмотря на сви особые свойства с точки зрения ядра, располагаются в файловой системе, как обычные файлы, они могут быть прочитаны, как и все файлы. Но в отличие от остальных, файлы каталогов не могут быть созданы или изменены обычными средствами; для сохранения целостности файловой системы ядро оставляет за собой контроль над содержимым этих файлов.

Настало время взглянуть на байты внутри каталога."

Далее приведен вывод команды "od -cb ."
Debian GNU/Linux 4.0
Спасибо сказали:
Аватара пользователя
Uncle_Theodore
Сообщения: 3339
ОС: Slackware 12.2, ArchLinux 64

Re: функция read

Сообщение Uncle_Theodore »

Нууу... Директорию, конечно, можно прочитать как файл...
man 3 readdir

А вообще, не стОит воспринимать философские концепции столь буквально... Все -- или процесс, или файл... В некотором смысле. :)
Спасибо сказали:
specter
Сообщения: 71
ОС: SLED 10

Re: функция read

Сообщение specter »

Uncle_Theodore писал(а):
30.09.2007 02:53
А вообще, не стОит воспринимать философские концепции столь буквально... Все -- или процесс, или файл... В некотором смысле. :)


Ни такие уж они и философские... POSIX всетаки мать его :) А отличаются в одной "букве" между прочем :)
Спасибо сказали:
Аватара пользователя
ivanr
Сообщения: 177
Статус: эblan
ОС: Debian 4.0

Re: функция read

Сообщение ivanr »

Uncle_Theodore писал(а):
30.09.2007 02:53
man 3 readdir

Я смотрел эту функцию, я не очень разобрался со структурой dirent, но по моему она не позволяет сделать то, что я хочу.
Debian GNU/Linux 4.0
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: функция read

Сообщение sergio »

char *varname - стиль си
char* varname - стиль си++
Различие в идеологии языков.
Разумеется, некоторые в си пишут тип* имя, некоторые и в сиплюс - тип *имя.
Для компилятора различия нет, как уже сказали, и сишном и плюсовому все равно.

Нащет каталога... так, dd сделать дамп каталога тоже не захотел... Я вот подозреваю, что "данных каталога" как таковых может и просто не существовать. Файловых систем-то много, для каждой свой модуль, только интерфейс общий. Так что если интересно - надо лезть в исходники модулей и смотреть, что там ваще есть... А readdir поди возвращает псевдосодержимое, которое и реализует как бы этот интерфейс...

Гы, а если оч хочется - то su и вперед, читать /dev/sdaN :happy:
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
ivanr
Сообщения: 177
Статус: эblan
ОС: Debian 4.0

Re: функция read

Сообщение ivanr »

specter писал(а):
30.09.2007 02:11
Теперь насчет программы - ты используешь read - это низкоуровневая функция и подозреваю она читает не список подкаталогов а что-то другое. Что - не знаю, скорее всего то, что лежит за адресом, возвращаемым dirfd. Т.е. абракадабру из файловой системы (фактически ты чиатешь содержимое /dev/hdX начиная с "точки" обозначенной твоей директорией).

да именно это я и хотел сделать, но read ничего не читала, а возвращала ошибку, а я хочу сделать так, что б читала, но не знаю, как.
Возможно, мне и нужно читать /dev/hdx, но как это сделать, я не очень понимаю :)
Debian GNU/Linux 4.0
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: функция read

Сообщение v04bvs »

ivanr писал(а):
30.09.2007 13:35
specter писал(а):
30.09.2007 02:11
Теперь насчет программы - ты используешь read - это низкоуровневая функция и подозреваю она читает не список подкаталогов а что-то другое. Что - не знаю, скорее всего то, что лежит за адресом, возвращаемым dirfd. Т.е. абракадабру из файловой системы (фактически ты чиатешь содержимое /dev/hdX начиная с "точки" обозначенной твоей директорией).

да именно это я и хотел сделать, но read ничего не читала, а возвращала ошибку, а я хочу сделать так, что б читала, но не знаю, как.
Возможно, мне и нужно читать /dev/hdx, но как это сделать, я не очень понимаю :)

И что ты ожидаешь прочитать из каталога? Это не файл, когда то давно в старых юниксах его можно было читать как файл, но смысла в этом нет никакого. Всё не есть файл, как бы этого не хотелось.
Спасибо сказали:
Аватара пользователя
ivanr
Сообщения: 177
Статус: эblan
ОС: Debian 4.0

Re: функция read

Сообщение ivanr »

v04bvs писал(а):
30.09.2007 16:30
И что ты ожидаешь прочитать из каталога? Это не файл, когда то давно в старых юниксах его можно было читать как файл, но смысла в этом нет никакого. Всё не есть файл, как бы этого не хотелось.

Дело не в том, что я ожидаю прочитать.
Я увидел пример из книги и подумал, а что получится? книга действительно написана на примере старой версии юникс.
Но вот что я увидел еще в одной книге, написанной уже на примере довольно современных версий линукс. Книга - "руководство системного администратора линукс"

Страница 196, глава 7 - "добавление жесткого диска"
упражнение 7.10
Цитирую:
"Просмотрите содержимое каталога (каталожного файла) с помощью утилиты hexdump или od. Каждая запись переменной длины представляет отдельный файл этого каталога. Найдите запись, соответствующую какому-либо реальному каталогу, и объясните назначение каждого из ее полей. Затем таким же способом проанализируйте каталог lost+found какой-нибудь файловой системы. Почему в каталожном файле так много имен, хотя сам каталог lost+found выглядит пустым."

Книга - "руководство системного администратора линукс второе издание" Издательский дом "вильяимс" - 2007 г.
Написана на примере следующих дистрибутивов:
Red Hat Enterprise Linux 4.3 ES
Fedora Core 5
SuSE Linux Enterprise 10.2
Debian GNU/Linux 3.2 "Etch" (тестовый выпуск от сентября 2006)
Ubuntu 6.06 "Drapper Drake"
Выходит, что в книге допущена ошибка?
Кстати, я, ради эксперимента, поставил старую ASPLinux 9.2 с ядром 2.4.22 и там то же самое.
Debian GNU/Linux 4.0
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: функция read

Сообщение serzh-z »

sergio писал(а):
30.09.2007 12:44
char *varname - стиль си
char* varname - стиль си++
Различие в идеологии языков.
o_O Это где сказано???
Спасибо сказали:
Аватара пользователя
uptime
Сообщения: 1661
Статус: Drinker with computing problems
ОС: kubuntu 8.04

Re: функция read

Сообщение uptime »

ivanr писал(а):
01.10.2007 23:26
Кстати, я, ради эксперимента, поставил старую ASPLinux 9.2 с ядром 2.4.22 и там то же самое.


А какую ФС использовали? Может с ext2 получится?

По поводу правил написания указателей. Сравните два варианта объявления переменных:

char* a, b;

char *a, b;

Компилятору то без разницы :)
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
Спасибо сказали:
Аватара пользователя
ivanr
Сообщения: 177
Статус: эblan
ОС: Debian 4.0

Re: функция read

Сообщение ivanr »

uptime писал(а):
01.10.2007 23:41
ivanr писал(а):
01.10.2007 23:26
Кстати, я, ради эксперимента, поставил старую ASPLinux 9.2 с ядром 2.4.22 и там то же самое.


А какую ФС использовали? Может с ext2 получится?

По поводу правил написания указателей. Сравните два варианта объявления переменных:

char* a, b;

char *a, b;

Компилятору то без разницы :)

по поводу объявления переменных, я уже понял, но все равно я никак не могу толком разобраться с объявлением переменных, функций, массивов, и указателей на массивы, указателей на указатели, и указателей на функции, и указателей на массивы функций, как-то геморно, по моему, в C и, наверно, в других языках с сишным синтаксисом это все объявляется. Я раньше знал только ассемблер под винду, там вообще нет проблем с объявлением чего-либо, но это и понятно.
Наверно с опытом придет.

По поводу файловых систем, не думаю, что ext2 и ext3 в этом отношении имеют разницу, они ведь почти идентичны, за исключением журналирования.
Debian GNU/Linux 4.0
Спасибо сказали:
Аватара пользователя
uptime
Сообщения: 1661
Статус: Drinker with computing problems
ОС: kubuntu 8.04

Re: функция read

Сообщение uptime »

ivanr писал(а):
01.10.2007 23:50
... как-то геморно, по моему, в C и, наверно, в других языках с сишным синтаксисом это все объявляется. Я раньше знал только ассемблер под винду, там вообще нет проблем с объявлением чего-либо, но это и понятно.
Наверно с опытом придет.


Ну, я обычно представляю себе память как лист в клетку... Пременная (её значение) занимает несколько клеток. Указатель, тоже переменная, но там записан адрес первой клетки из тех куда записано значение переменной, ну и так далее...
Если кодили на асме, вам должно быть всё понятно :)
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
Спасибо сказали:
Аватара пользователя
ivanr
Сообщения: 177
Статус: эblan
ОС: Debian 4.0

Re: функция read

Сообщение ivanr »

uptime писал(а):
01.10.2007 23:59
ivanr писал(а):
01.10.2007 23:50
... как-то геморно, по моему, в C и, наверно, в других языках с сишным синтаксисом это все объявляется. Я раньше знал только ассемблер под винду, там вообще нет проблем с объявлением чего-либо, но это и понятно.
Наверно с опытом придет.


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

да это все понятно, но вообще-то не лист в клетку, а линейка с делениями, так как память - линейное адресное пространство.
Не понятно только с синтаксисом
Допустим вот, при условии, что функция возвращает некоторое число

int* some_pointer:
*some_pointer some_function();
или так
some_pointer some_function();

если я правильно понимаю, то первый вызов вернет некоторое число и поместит его по адресу хранящимуся в some_pointer,
Во втором случае. если я не ошибаюсь, функция вернет некоторое число и поместит его в переменную some_pointer, являющуюся указателем.
Так вот, для меня это не очевидно и я никак не могу привыкнуть к этим простым вещам, кажущимся мне излишне примудрыми. В ассемблере все проще "mov [some_pointer],some_reg" или "mov some_pointer,some_reg"
Захочешь не ошибешься.
И потом, в ассемблере не было разницы вообще между переменной и указателем, и не было никаких массивов указателей на указатели указателей еще одних указателей :)
Все просто:) переменная и все, а указатель она или нет, так это тебе решать
Debian GNU/Linux 4.0
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: функция read

Сообщение sergio »

serzh-z писал(а):
01.10.2007 23:33
sergio писал(а):
30.09.2007 12:44
char *varname - стиль си
char* varname - стиль си++
Различие в идеологии языков.
o_O Это где сказано???

Открываем К.Р. и Страуструпа, надеваем очки и смотрим внимательно.
Это импирическое наблюдение. После знакомства с энным кол-вом исходников у внимательного человека оно должно сложиться. Где по коду видно, что программер тяготеет к си (на каком бы языке не писал в данный момент), там тип *имя, где видно что код в объектном духе там тип* имя. Это что до стилей. Что до "идеологии" - то это имхо надо чувствовать, или оно есть, или его нет, объяснять я не возьмусь. :happy: Но где написано, что в Си++ контроль типов строже сишного (кажется, даже нынешнего, не говоря о...) - объяснять не надо, надеюсь? :)

Отсюда, кстати, и эта бяка, о которой uptime говорил: объявление переменных списком, сишное наследие, дающее неприятный эффект в си++ и ваще малопонятную с непривычки запись. Впрочем, списки переменных в начале функций - это тоже кондово-сишное наследие, в сиплюс они не требуются, я скажем их никогда не использую, и у меня этой проблемы нету. :happy:
Да, в какой-то старой книжке по си помнится, про объявления толковалось, мол, есть базовый тип и есть модификатор. Так вот, * [] и ф() - это модификаторы типо, а инт - базовый тип. Отсюда мол и записи вроде
int a, *b, c [3], d(char*), e, *f, *g, h() ;
Впрочем, возможно, это сугубо местечковое объяснение, но как бы то ни было, форма записи именно такова.
В си++ как все понимают, это три разных типа инт, инт* и инт (*)(чар*), и никакого особого родства между ними не наблюдается. Ну, отсюда до идеологических вопросов уже недалеко, но я пожалуй остановлюсь. =)
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
ivanr
Сообщения: 177
Статус: эblan
ОС: Debian 4.0

Re: функция read

Сообщение ivanr »

вот еще одно.
int** some_pointer = some_value;
++some_value;
Я долго не мог понять. как указатель на указатель, увеличенный на единицу, может содержать корректное значение. Я посмотрел на вывод команды gcc -S source.c и все стало ясно, оказывается, увеличивается он не на единицу, а на 4/
Так вот, об этом явно нигде не говорилось, это в принципе и так ясно, но я сомневался и для этого пришлось смотреть ассемблерный код.
Debian GNU/Linux 4.0
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: функция read

Сообщение sergio »

ivanr писал(а):
02.10.2007 00:24
Допустим вот, при условии, что функция возвращает некоторое число

int* some_pointer:
*some_pointer some_function();
или так
some_pointer some_function();

Бррр...
Вот тут как раз можно мыслить в духе ассемблера-си, а можно в духе си++. =)
Функция возвращает указатель, если она объявлена (где-то) как возвращающая указатель.

int* func(void) ; // функция возвращающая указатель на инт

typedef int* PtrToInt ;
PtrToInt func(void) ; // функция возвращающая указатель на инт =)

#define PtrToInt int* ;
PtrToInt func(void) ; // функция возвращающая указатель на инт =)

Что она возвращает, то можно присвоить переменной соотв-го типа, т.е. типа указатель на инт.

int* ptr ;
ptr = func() ;
int a = 33 ;
ptr = & a ;
printf("%d\n", (* ptr)) ;


По последнему посту.
Указатель на тип Т при прибавлении N увеличивает абсолютное значение на (N * sizeof(T)).
Указатель на тип Т* (т.е. Т**) при прибавлении N увеличивает абсолютное значение на (N * sizeof(T*)).
Операция осмысленна когда указатель до и после указывает на элементы одного массива или на мнимый элемент следующий за последним элементом массива.
Т.е. можно мыслить, что в си операция индексного доступа к массиву (и аналогичная арифметика указателей) это что-то типа макроподстановки ассемблера
int array [SIZE] ;
int a = array [n] ; ----->> int a = * (array + (n * sizeof(int)))
или
int a = array [n] ; ----->> int a = * (& array [0] + (n * sizeof(int)))

UPD

Мда, сорри, это типа псевдокод в конце, чтобы это было более похоже на правду, надо кастать array к целочисленному типу, а после сложения обратно к инт* перед разыменованием, вроде

int a = array [n] ; ----->> int a = * (int*) ( ((long) &array) + (n * sizeof(int)) )

Примерно так, только теперь читать тяжело. =)
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: функция read

Сообщение Red User »

Код: Выделить всё

$ man 3posix read 2>/dev/null | grep -A 2 EISDIR
       EISDIR The fildes argument refers to a directory and the implementation
              does not allow the directory to be read using read() or pread().
              The readdir() function should be used instead.
$ man 2 read 2>/dev/null | grep EISDIR
       EISDIR fd refers to a directory.


По-видимому, в некоторых POSIX-системах можно читать директории с помощью read. Но Linux (во всяком случае современный) такого не позволяет.
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали: