LINUX.ORG.RU

Сообщения erDiZz

 

[проект] Переносимый фреймворк из GNU-утилит и библиотек для разработчика

Всем привет!

Некоторое время назад у меня появилась идея собрать набор базовых средств разработки (gcc и основные библиотеки), который можно было бы установить параллельно с теми, которые уже есть в системе. Идея была успешно воплощена в жизнь, в результате появился проект "Суверен", можно почитать об этом тут:
http://sgn.sourceforge.net/readme_rus.html
http://sourceforge.net/projects/sgn

Вкратце: утилиты/библиотеки устанавливаются в директорию /opt/sgn, и зависят _только от библиотек из /opt/sgn. Благодаря этому можно просто скачать прекомпилированный архив с "Сувереном", распаковать его в /opt/sgn, и сразу приступать к работе. Единственное требование к системе - чтобы ABI ядра был совместим с прекомпилированной glibc.

По сути система представляет собой набор скриптов для сборки пакетов (а-ля e-build'ов). Процесс сборки с особым префиксом взят из документации к "Linux from scratch".

Вот список причин, почему это может быть удобно (взято с веб-страницы):

* Библиотеки и утилиты в дистрибутиве, который вы используете,
устарели (нет возможностей, присутствующих в последних версиях; API устарел; есть известные ошибки), и вы хотите установить более новую версию, не поломав при этом существующую инсталляцию Linux;
* В выбранный вами дистрибутив включена новая версия библиотеки/утилиты, в которой есть регрессии по сравнению с предыдущими версиями. Вы хотите работать с одной из предыдущих версий, не нарушая при этом целостность дистрибутива;
* Вам нужна утилита/библиотека, которая не входит в установленный дистрибутив Linux, и при этом конфликтует с некоторыми из установленных пакетов;
* При работе вы используете сразу несколько компьютеров (пару ноутбуков и десктопов, офисную рабочую станцию, дюжину серверов в тестовом кластере и т.п.), и не хотите заниматься сопровождением и синхронизацией установленных на этих компьютерах дистрибутивов;
* Тип используемого дистрибутива Linux устанавливается политикой компании, и вы не хотите тратить время на его настройку и проверку того, что всё работает так, как надо;
* У вас есть сервер, на котором не установлены -devel-пакеты (и, возможно, нет gcc), и вы хотите скомпилировать и запустить программу, не устанавливая при этом никаких дополнительных пакетов.

В состав фреймворка можно включить всё, что угодно, потому что он модульный. Сейчас состав пакетов такой:

atk-1.9.1.sgn
binutils-2.18.sgn
bzip2-1.0.4.sgn
cairo-1.2.6.sgn
cups-1.2.12.sgn
fontconfig-2.5.0.sgn
freetype-2.3.5.sgn
gcc-4.1.2+gm2-cvs_07-12-20_10-57.sgn
gcc-4.2.2.sgn
glib-2.12.13.sgn
glibc-2.7.sgn
gtk+-2.10.14.sgn
jpegsrc.v6b.sgn
libpng-1.2.8.sgn
libxml2-2.6.30.sgn
linux-headers-2.6.23.8.sgn
pango-1.16.4.sgn
pkg-config-0.20.sgn
tiff-3.7.4.sgn
xlib-7.3.sgn
xproto-7.3.sgn
zlib-1.2.3.sgn

Может заинтересует кого-нибудь?

>>>

 

erDiZz
()

sendfile из файла в файл не работает?

sendfile в принципе не работает на ядрах 2.6.x?
Судя по man sendfile всё должно работать, а у меня стабильно
возвращает EINVAL. Ядро 2.6.18.

Единственное, что нашёл по этому поводу:
http://ilia.ws/archives/13-sendfile-syscall-and-why-the-2.6-linux-kernel-sucks!.
html

Благо, теперь появился новый способ быстрого копирования - с помощью
splice(), с ним всё нормально работает.

Тестовая программа:

#include <stdio.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sendfile.h>
#include <unistd.h>
#include <fcntl.h>

int main (int argc, char **argv)
{
    int     fd_in,
	    fd_out;
    off_t   offset;
    ssize_t last_sent;

    if (argc < 3) {
	fprintf (stderr, "2 arguments required\n");
	return -1;
    }

    fd_in = open (argv [1], O_RDONLY);
    if (fd_in == -1) {
	perror ("open #1");
	return -1;
    }

    fd_out = open (argv [2], O_WRONLY | O_CREAT);
    if (fd_out == -1) {
	perror ("open #2");
	return -1;
    }

    offset = 0;
    for (;;) {
	last_sent = sendfile (fd_out, fd_in, &offset, 1 << 20);
	if (last_sent < 0) {
	    perror ("sendfile");
	    return -1;
	}

	if (last_sent == 0)
	    break;
    }

    fprintf (stderr, "OK\n");

    return 0;
}
erDiZz
()

RSS подписка на новые темы