Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с sendfile(), не вижу пути исправить 
:(
    Опции темы
comcon1
  Дата 23.7.2005, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



Вот кусок проги.
Код

char *insr = "infile.txt";
char *ousr = "outfile.txt";
        int id = open(insr, O_RDONLY);
    int od;
    off_t offset = 0;
        assert(id != -1); // ошибка получения дескрипторов
        struct stat _curstat;
        if (fstat(id, &_curstat) == -1) {
        abort(); 
        } else if (! ( S_ISREG(_curstat.st_mode) || S_ISLNK(_curstat.st_mode) )) {
        ; // пока ничего не делаем...
    } else {
        od = open(ousr, O_CREAT | O_WRONLY, _curstat.st_mode);
        assert(od != -1);
                if (sendfile(od, id, &offset, _curstat.st_size) == -1) {
            fprintf(stderr, "Error in copying file %d | %d\n", errno, EINVAL);
            abort();
        }
                close(od);
        }
    close(id);

Выдает она следующее:
Код

Error in copying file 22 | 22.

Смотрю, что за ошибка (EINVAL). Ман мне пишет:
Код

EINVAL Descriptor  is  not valid or locked, or an mmap()-like operation is not available
______  for in_fd.

in_fd - дескриптор входного файла. Мож кто сталкивался - знаете, что делать??? Открываются файлы нормально. Оба. Но входной дескриптор ей почему-то не катит... Хотя файл совершенно обычный. И всего 700 байт.


--------------------
PM MAIL   Вверх
bilbobagginz
Дата 24.7.2005, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



какая ОСь ?
SELinux не включён ли ?
BSD process accounting ?

в догонку, открываешь с O_RDONLY: может стоит в добавку с O_NONBLOCK или O_NDELAY .....

Это сообщение отредактировал(а) bilbobagginz - 24.7.2005, 20:54


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
comcon1
Дата 25.7.2005, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



SELinux не включён ли ?
BSD process accounting ?
--- что это вообще такое??
Ось - Mandrake 10.
На счет O_NONBLOCK - ща проверю.



--------------------
PM MAIL   Вверх
comcon1
Дата 25.7.2005, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



Ядро (забыл сказать) 2.6. Проверил с такими флагами - то же самое.. Эта хренька вызывается из потока. Мож как-то с этим связано??
И я ща еще проверю на gentoo...
Тот же errno при вызове sendfile(). Видимо не в системе дело...

Это сообщение отредактировал(а) comcon1 - 25.7.2005, 09:57


--------------------
PM MAIL   Вверх
chaos
Дата 25.7.2005, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 3
Всего: 44



хм, вот рабочий пример
Код

int main(int argc, char **argv) {
        int src;               /* file descriptor for source file */
        int dest;              /* file descriptor for destination file */
        struct stat stat_buf;  /* hold information about input file */
        off_t offset = 0;      /* byte offset used by sendfile */

        /* check that source file exists and can be opened */
        src = open(argv[1], O_RDONLY);

        /* get size and permissions of the source file */
        fstat(src, &stat_buf);

        /* open destination file */
        dest = open(argv[2], O_WRONLY|O_CREAT, stat_buf.st_mode);

        /* copy file using sendfile */
        sendfile (dest, src, &offset, stat_buf.st_size);

        /* clean up and exit */
        close(dest);
        close(src);
}

PM WWW   Вверх
comcon1
Дата 25.7.2005, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



Это пример из книги Митчелла. Не работает даже он. По ходу в этой функции глюки. Я смотрел исходники проги cp -- нигде не используется sendfile().
Потом нашел где-то приписку к этому sendfile(), который при получении EINVAL запускает стандартное копирование http://www.ussg.iu.edu/hypermail/linux/ker...911.2/0489.html.

То есть -- ошибка не у меня одного.. Придется пользоваться read () и write () . Да и портабельнее будет. smile . Да и портабельнее будет.


--------------------
PM MAIL   Вверх
chaos
Дата 25.7.2005, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 3
Всего: 44



все верно, у тебя все сведется к бональному
open
open

цикл чтения по блокам
read
write

close
close

PM WWW   Вверх
bilbobagginz
Дата 25.7.2005, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

Репутация: 4
Всего: 317



BSD process accounting... это такая штука ограничения и мониторинга.
не важно - ты на линухе и видимо её не включал.

насчёт sendfile()...есть отношение к виду файловой системы - с нек-рыми файловыми системами вызов НЕ работает [ не проверял с какими ]

насчёт потоков - вполне возможно что поток блокирует ввод/вывод.
протесть без потоков.

я запустил тест на 2-х системах:

Убунту (ядро 2.6.12.1 ) - выдаёт ту же ошибку.
RHEL3 ( ядро: 2.4.х ) работает smile


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
comcon1
Дата 25.7.2005, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



Протестил без потоков (писал выше). Мож из-за 2.6? Система в gentoo и в Mandrake ext3.

Ай.. Да я так понял лучше ее не юзать - эту функцию. Делаю по тупому.


--------------------
PM MAIL   Вверх
GrayCardinal
Дата 25.10.2005, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



Цитата

Это называется - читайте документацию (man 2 sendfile):
Presently (Linux 2.6.9): in_fd, must correspond to a file which supports mmap()-like operations (i.e., it cannot be a socket); and out_fd must refer to a socket.

Это с другого форума. RTFM, однако.

ЗЫ.
Вчера думал усе, сейчас буду ядро раскурочивать. Очень уж хотелось sendfile поюзать. Седня прошарил форумы - оказалось просто manpages 1.x для 2.6 ядрышек не подходит.

Это сообщение отредактировал(а) GrayCardinal - 25.10.2005, 10:07


--------------------
PM MAIL WWW   Вверх
comcon1
Дата 10.11.2005, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



Да уж. Это сильно режет возможности этой функции.


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.