<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-810837500102926940</atom:id><lastBuildDate>Mon, 30 Dec 2024 19:06:36 +0000</lastBuildDate><category>Кодинг</category><category>Настройка</category><category>Железо</category><category>SEO</category><title>Программирование в *nix</title><description>Блог о программировании в Unix подобных системах. На примерах рассматриваются функции, необходимые в системном и сетевом программировании.</description><link>http://nix-blog-1.blogspot.com/</link><managingEditor>noreply@blogger.com (Александр)</managingEditor><generator>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-1684735112059260421</guid><pubDate>Fri, 02 Mar 2012 04:24:00 +0000</pubDate><atom:updated>2012-03-02T13:40:47.284+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Настройка</category><title>Статистика FreeBSD</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;ol&gt;&lt;li&gt;Информация о дисках &lt;ol&gt;&lt;li&gt;&lt;b&gt;mount&lt;/b&gt; — показывает смонтированные подразделы и флаги из монтирования&lt;/li&gt;
&lt;li&gt;&lt;b&gt;df&lt;/b&gt; — показывает смонтированные подразделы, их размер и свободное место на них&lt;/li&gt;
&lt;li&gt;&lt;b&gt;fdisk /dev/ad0&lt;/b&gt; — показывает информацию о диске ad0 и разделах на нем&lt;/li&gt;
&lt;li&gt;&lt;b&gt;disklabel /dev/ad0s1&lt;/b&gt; — показывает список подразделов в первом разделе диска ad0&lt;/li&gt;
&lt;li&gt;&lt;b&gt;swapinfo&lt;/b&gt; — показывает список подразделов свопинга на дисках и их использование&lt;/li&gt;
&lt;li&gt;&lt;b&gt;fstat&lt;/b&gt; — показывает список открытых файлов (имена файлов не выводятся)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;pstat -f&lt;/b&gt; — выводит список открытых файлов (имена файлов не выводятся)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;systat -vmstat&amp;nbsp;&lt;i&gt;n&lt;/i&gt;&lt;/b&gt; — каждые&amp;nbsp;&lt;i&gt;n&lt;/i&gt;  секунд выводит количество транзакций с диском в секунду, объем  записанных/считанных данных на диск в секунду, средний размер транзакции  и процент времени в течение которого диск был занят работой.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;iostat&lt;/b&gt; — выводит информацию, аналогичную systat  -vmstat, но не выводит занятости диска по времени и может выводить  среднюю статистику с момента загрузки.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;vmstat&lt;/b&gt; — выводит количество операций на диске в секунду&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/stand/sysinstall&lt;/b&gt; — можно посмотреть и изменить разметку диска и монтирование&lt;/li&gt;
&lt;li&gt;&lt;b&gt;less /etc/fstab&lt;/b&gt; — таблица монтирования при загрузке&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Информация о процессоре и памяти &lt;ol&gt;&lt;li&gt;&lt;b&gt;systat -vmstat&amp;nbsp;&lt;i&gt;n&lt;/i&gt;&lt;/b&gt; — вывод показателей  загрузки (number of jobs in the run queue averaged over 1, 5 and 15  min), состояния памяти (в страницах), количества процессов в группах,  количество вызовов специальных функций ядра (traps, interrupts, system  calls, network software interrupts), использование процессора,  трансляции имен, активность свопа, прерывания, а также информацию по  использованию диска (см)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;top&lt;/b&gt; — аналогичная информация в сокращенном виде +  использование памяти и свопа в мегабайтах, список процессов,  отсортированных по использованию процессора.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ps afx&lt;/b&gt; — список запущенных процессов и время процессора на каждый&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Информация о сети &lt;ol&gt;&lt;li&gt;&lt;b&gt;ifconfig&lt;/b&gt; — список сетевых интерфейсов с  ip-адресами, масками, mac-адресами, типами карт и их статусами (названия  карточек можно посмотреть в файле конфигурации ядра)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;systat -ifstat&amp;nbsp;&lt;i&gt;n&lt;/i&gt;&lt;/b&gt; — объем трафика за n секунд на всех сетевых интерфейсах&lt;/li&gt;
&lt;li&gt;&lt;b&gt;netstat&lt;/b&gt; — вывод активных сетевых соединений (сокетов)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;systat -netstat&amp;nbsp;&lt;i&gt;n&lt;/i&gt;&lt;/b&gt; — аналог netstat в реальном времени&lt;/li&gt;
&lt;li&gt;&lt;b&gt;systat -ip&amp;nbsp;&lt;i&gt;n&lt;/i&gt;&lt;/b&gt; — таблица IP-пакетов и ошибок по типам за n секунд&lt;/li&gt;
&lt;li&gt;&lt;b&gt;systat -tcp&amp;nbsp;&lt;i&gt;n&lt;/i&gt;&lt;/b&gt; — таблица TCP-пакетов и ошибок по типам за n секунд&lt;/li&gt;
&lt;li&gt;&lt;b&gt;systat -icmp&amp;nbsp;&lt;i&gt;n&lt;/i&gt;&lt;/b&gt; — таблица ICMP-пакетов и ошибок по типам за n секунд&lt;/li&gt;
&lt;li&gt;&lt;b&gt;netstat -ibt&lt;/b&gt; — список интерфейсов, разбитых по  ip-адресам (!) с объемом трафика на каждом, количеством ошибок,  коллизий, значением watchdog-таймера&lt;/li&gt;
&lt;li&gt;&lt;b&gt;netstat -inb&lt;/b&gt; По умолчанию “netstat -i” во FreeBSD показывает число пакетов и байт по каждому интерфейсу&lt;/li&gt;
&lt;li&gt;&lt;b&gt;netstat -inbh &lt;/b&gt;Для наглядного просмотра, можно использовать опцию “-h”, которая сокращает байтовый вывод до Кб, Мб или Гб.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;systat -ifstat&lt;/b&gt; (или systat -if) Интенсивность передачи трафика&lt;/li&gt;
&lt;li&gt;&lt;b&gt;netstat -iw1&lt;/b&gt;другой вариант&lt;/li&gt;
&lt;li&gt;&lt;b&gt;netstat -r&lt;/b&gt; — таблица маршрутизации&lt;/li&gt;
&lt;li&gt;&lt;b&gt;arp -a&lt;/b&gt; — таблица ARP&lt;/li&gt;
&lt;li&gt;&lt;b&gt;tcpdump -i rl0 host 192.168.61.20 and port 80&lt;/b&gt; — сниффер пакетов на интерфейсе rl0, фильтрующий пакеты, содержащие адрес 192.168.61.20 и порт 80&lt;/li&gt;
&lt;li&gt;&lt;b&gt;trafshow -i rl0&lt;/b&gt; — программа для сортировки и вывода сетевых потоков (устанавливается дополнительно пакетом или из портов)&lt;/li&gt;
&lt;li&gt;sockstat &lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Службы времени &lt;ol&gt;&lt;li&gt;&lt;b&gt;date&lt;/b&gt; — выводит текущее время и дату&lt;/li&gt;
&lt;li&gt;&lt;b&gt;w&lt;/b&gt; — выводит, сколько времени назад система загрузилась и залогиненных пользователей&lt;/li&gt;
&lt;li&gt;&lt;b&gt;last&lt;/b&gt; — выводит историю перезагрузок и входов пользователей&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2012/03/freebsd.html</link><author>noreply@blogger.com (Александр)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-2117396274576663037</guid><pubDate>Fri, 13 Jan 2012 22:52:00 +0000</pubDate><atom:updated>2012-01-14T06:32:30.085+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Настройка</category><title>FreeBSD монтирование USB HDD с NTFS</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Подключаем USB HDD, смотрим как определился:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;$ dmesg&lt;br /&gt;
da0 at umass-sim1 bus 1 scbus3 target 0 lun 0&lt;br /&gt;
da0: &amp;lt;Toshiba External USB HDD &amp;gt; Fixed Direct Access SCSI-4 device &lt;br /&gt;
da0: 40.000MB/s transfers&lt;br /&gt;
da0: 610480MB (1250263728 512 byte sectors: 255H 63S/T 77825C)&lt;/blockquote&gt;Теперь монтируем его содержимое в папку с перекодировкой  через стандартный драйвер ntfs (только чтение, не поддерживает запись):&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;# mount_ntfs -C koi8-r -m 755 -u hawk -g hawk /dev/da0s1 /mnt/usb &lt;/blockquote&gt;Можно монтировать через ntfs-3g, будет и чтение и запись, единственное проблемы с кодировками. Сначала собираем &lt;b&gt;fusefs-ntfs&lt;/b&gt;: &lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;# cd /usr/ports/sysutils/fusefs-ntfs&lt;br /&gt;
# make install clean&lt;/blockquote&gt;Добавляем в rc.conf&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;fusefs_enable="YES" &lt;/blockquote&gt;Запускаем:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;# /usr/local/etc/rc.d/fusefs start &lt;/blockquote&gt;Можно удостовериться, что модуль ядра fuse.ko подгружен:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;$ kldstat | grep fuse.ko &lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;12&amp;nbsp;&amp;nbsp;&amp;nbsp; 1 0xffffffff82031000 a8ea&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fuse.ko &lt;/blockquote&gt;Модуль можно подгрузить так:&amp;nbsp; &lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;# kldload /usr/local/modules/fuse.ko &lt;/blockquote&gt;Ну и монтируем:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;# ntfs-3g -o rw,uid=1001,gid=1001,locale=ru_RU.UTF-8 /dev/da0s1 /mnt/usb &lt;/blockquote&gt;&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2012/01/freebsd-usb-hdd-ntfs.html</link><author>noreply@blogger.com (Александр)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-734075778229225142</guid><pubDate>Fri, 13 Jan 2012 21:35:00 +0000</pubDate><atom:updated>2012-01-14T04:35:26.408+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Настройка</category><title>Изменение размера слайса FreeBSD</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Для этого потребуется временное хранилище.&lt;br /&gt;
Для начала создаем бекапы каждого раздела:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;# df&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;/dev/ad6s1a&amp;nbsp; 10154158&amp;nbsp;&amp;nbsp;&amp;nbsp; 892000&amp;nbsp;&amp;nbsp; 8449826&amp;nbsp;&amp;nbsp;&amp;nbsp; 10%&amp;nbsp;&amp;nbsp;&amp;nbsp; /&lt;br /&gt;
devfs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp; 100%&amp;nbsp;&amp;nbsp;&amp;nbsp; /dev&lt;br /&gt;
/dev/ad6s1e&amp;nbsp; 10154158&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 45344&amp;nbsp;&amp;nbsp; 9296482&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0%&amp;nbsp;&amp;nbsp;&amp;nbsp; /tmp&lt;br /&gt;
/dev/ad6s1f 903370842 155157450 675943726&amp;nbsp;&amp;nbsp;&amp;nbsp; 19%&amp;nbsp;&amp;nbsp;&amp;nbsp; /usr&lt;br /&gt;
/dev/ad6s1d&amp;nbsp; 10154158&amp;nbsp;&amp;nbsp;&amp;nbsp; 304838&amp;nbsp;&amp;nbsp; 9036988&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3%&amp;nbsp;&amp;nbsp;&amp;nbsp; /var&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;# dump&amp;nbsp; -auLf ~/ad6s1f.dump /dev/ad6s1f&lt;br /&gt;
# dump&amp;nbsp; -auLf ~/ad6s1a.dump /dev/ad6s1a&lt;br /&gt;
# dump&amp;nbsp; -auLf ~/ad6s1e.dump /dev/ad6s1e&lt;br /&gt;
# dump&amp;nbsp; -auLf ~/ad6s1d.dump /dev/ad6s1d&lt;/blockquote&gt;a - нужен чтоб он не мучился с поиском конца ленты.&lt;br /&gt;
u - обновить историю дампов&lt;br /&gt;
L - делать дамп со снимка системы&lt;br /&gt;
f - делать дамп в файл&lt;br /&gt;
&lt;br /&gt;
Переписываем бекапы на временное хранилище и переразбиваем диск, после чего:&lt;br /&gt;
Грузимся с Fixit и для каждого раздела(здесь только для f) выполняем:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;# newfs /dev/ad6s1f&lt;br /&gt;
# mount /dev/ad6s1f /mnt&lt;/blockquote&gt;&lt;blockquote&gt;# cd /mnt&lt;br /&gt;
# restore -xf /path2backup/ad6s1f.dump&lt;/blockquote&gt;x - восстановить все&lt;br /&gt;
f - из файла &lt;br /&gt;
Если будет жаловаться на недостаток места в /tmp, нужно создать в /tmp симлинк. Не забудьте удалить его когда закончите&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2012/01/freebsd_7852.html</link><author>noreply@blogger.com (Александр)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-759644896163082898</guid><pubDate>Fri, 13 Jan 2012 21:22:00 +0000</pubDate><atom:updated>2012-01-14T04:22:48.345+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Настройка</category><title>Обновление ядра, мира и портов в FreeBSD</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span style="font-size: large;"&gt;Бинарное обновление &lt;/span&gt;&lt;br /&gt;
Для бинарного обновления, если используется ядро GENERIC:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre class="shell"&gt;# freebsd-update upgrade -r 8.2-RELEASE
# freebsd-update install
# shutdown -r now
# freebsd-update install
# freebsd-update install
# shutdown -r now&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: large;"&gt;Обновление через csup &lt;/span&gt;&lt;br /&gt;
&amp;nbsp;Обновление исходных текстов:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre class="shell"&gt;# cp /usr/share/examples/cvsup/standard-supfile /etc/supfile&amp;nbsp;&lt;/pre&gt;&lt;/blockquote&gt;Приводим супфайл к виду&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre class="mark"&gt;*default host=cvsup6.ru.FreeBSD.org 
# Список зеркал можно найти тут http://www.freebsd.org/doc/handbook/cvsup.html#CVSUP-MIRRORS
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=RELENG_8_2
# Список тегов http://www.freebsd.org/doc/handbook/cvs-tags.html
*default delete use-rel-suffix
*default compress
src-all&lt;/pre&gt;&lt;/blockquote&gt;&amp;nbsp;Запускаем:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre class="shell"&gt;# csup -g -L 2 /etc/supfile&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: large;"&gt;Компиляция и установка &lt;/span&gt;&lt;br /&gt;
Чистим /usr/obj/:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;br /&gt;
&lt;pre class="shell"&gt;# cd /usr/obj
# chflags -R noschg *
# rm -rf *
# cd /usr/src
# make cleandir  # хендбук рекомендует выполнять эту команду дважды (!)
# make cleandir&lt;/pre&gt;&lt;/blockquote&gt;&amp;nbsp;Строим: &lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre class="shell"&gt;# cd /usr/src&amp;nbsp;&lt;/pre&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;pre class="shell"&gt;# make -s -j4 buildworld&lt;/pre&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;pre class="shell"&gt;# make -j4 -s buildkernel KERNCONF=Имяядра&lt;/pre&gt;&lt;/blockquote&gt;&amp;nbsp;Ставим:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre class="shell"&gt;# make -s installkernel KERNCONF=Имяядра&lt;/pre&gt;&lt;/blockquote&gt;Перезагружаемся в single user mode&amp;nbsp; или с помощью команды&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre class="shell"&gt;# make -s installkernel KERNCONF=GARROTTE&lt;/pre&gt;&lt;/blockquote&gt;При перезагрузке нужно смонтированы будут не все разделы, монтируем:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre class="shell"&gt;# mount -u
# mount -a &lt;/pre&gt;&lt;/blockquote&gt;&amp;nbsp;Перед установкой разбираемся с конфигами:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre class="shell"&gt;# mergemaster -p&lt;/pre&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;   d - оставить старый вариант файла, удалив новый;&lt;/li&gt;
&lt;li&gt;    i - установить новый, удалив старый;&lt;/li&gt;
&lt;li&gt;    m - построчное сравнение старого и нового файла;&lt;/li&gt;
&lt;li&gt;    v - сравнить файлы еще раз.&lt;/li&gt;
&lt;/ul&gt;При выборе построчного сравнения. на экран быдут выведены обе версии  файла, слева — содержимое старого файла, справа — нового. Возможные  варианты действий:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;l - использовать вариант слева, то есть старый;&lt;/li&gt;
&lt;li&gt;r - использовать вариант справа, то есть новый;&lt;/li&gt;
&lt;/ul&gt;Ставим мир:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre class="shell"&gt;# make installworld&lt;/pre&gt;&lt;/blockquote&gt;Чистим старые библиотеки:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre class="shell"&gt;# cd /usr/src &amp;amp;&amp;amp; make check-old
# yes | make delete-old
# yes | make delete-old-libs&lt;/pre&gt;&lt;/blockquote&gt;&amp;nbsp;И /usr/obj/:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre class="shell"&gt;# cd /usr/obj &amp;amp;&amp;amp; chflags -R noschg * &amp;amp;&amp;amp; rm -rf *&amp;nbsp;&amp;nbsp;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: large;"&gt;Обновление портов&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Если дерево портов ещё не развернуто:&lt;/span&gt; &lt;/span&gt;&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;# portsnap fetch extract&lt;/blockquote&gt;Если уже: &lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;# portsnap fetch update&lt;/blockquote&gt;Теперь обновляем утановленные порты утилитой portupgrade:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;br /&gt;
&lt;pre&gt;# portupgrade -arR &lt;/pre&gt;&lt;/blockquote&gt;Также потребуется указать флаг для конфигурации:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;-c - Если вы хотите &lt;span class="st"&gt;пропустить задание опций для портов, у которых уже были заданы требуемые опции.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class="st"&gt;-C - если&amp;nbsp; нужно заново задаь конфигурацию всем портам(Это долго)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;span class="st"&gt;&amp;nbsp; Так же можно использовать portmaster, но я не вижу особой разницы.&lt;/span&gt;&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2012/01/freebsd_14.html</link><author>noreply@blogger.com (Александр)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-7903403425862607792</guid><pubDate>Tue, 03 Jan 2012 20:29:00 +0000</pubDate><atom:updated>2012-01-04T15:18:31.484+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Кодинг</category><title>Модули ядра FreeBSD</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;В этой статье будет рассмотрен обычный модуль, который выводит сообщение при его загрузке и выгрузке. Для этого ядро должно быть собрано с опцией SCHED_ULE. Также частота генерации прерываний должна быть снижена до 100, если ваша система запущена на виртуальной машине.&lt;br /&gt;
echo kern.hz=100 &amp;gt;&amp;gt; /boot/loader.conf&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&amp;nbsp;&lt;span style="font-size: large;"&gt;Hello world&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Для удобства сборки модуля есть специальный makefile &lt;/span&gt;&lt;/span&gt;&lt;code&gt;/usr/src/share/mk/bsd.kmod.mk&lt;/code&gt;, который выполнит за вас всю работу по сборке модуля. Всё что нужно, это определить 2 вещи:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Имя модуля ядра через переменную “KMOD”;&lt;/li&gt;
&lt;li&gt;Исходники модуля через переменную “SRCS”;&lt;/li&gt;
&lt;/ul&gt;Дальше остается только вложить в ваш makefile &lt;code&gt;bsd.kmod.mk&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Makefile должен находиться в одной директории с нашим исходником.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
Makefile:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;br /&gt;
&lt;pre&gt;# Важно чтобы вложение &amp;lt;bsd.kmod.mk&amp;gt; происходило после обьявления переменных KMOD и SRCS.

# Имя модуля
KMOD    =  hello_fsm

# Исходные файлы модуля
SRCS    =  hello_fsm.c

# makefile для модуля ядра
.include &amp;lt;bsd.kmod.mk&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-size: large;"&gt;Создание модуля&lt;/span&gt;&lt;br /&gt;
Теперь пришло время взглянуть на код модуля и механизмы вставки и извлечения модуля из ядра.&lt;br /&gt;
Модуль может быть добавлен в уже запущенное ядро. Когда модуль загружен, создается событие “load”. Когда модуль извлечен, создается событие “unload”. Сам модуль ответственен за поддержку этих событий.&lt;br /&gt;
Событие создается в форме символических констант, обьявленных в заголовочном файле &lt;code&gt;/usr/include/sys/module.h&lt;/code&gt; (&lt;code&gt;&amp;lt;sys/module.h&amp;gt;&lt;/code&gt;). Два основных события связаны с переменными &lt;code&gt;MOD_LOAD&lt;/code&gt; and &lt;code&gt;MOD_UNLOAD&lt;/code&gt;.&lt;br /&gt;
Модуль использует макрос DECLARE_MODULE для оповещения ядра. Ядро в свою очередь создает событие. &lt;br /&gt;
&lt;code&gt;DECLARE_MODULE&lt;/code&gt; определен в &lt;code&gt;&amp;lt;sys/module.h&amp;gt;&lt;/code&gt; и имеет четыре параметра:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;code&gt;name&lt;/code&gt;. Имя.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;data&lt;/code&gt;. &lt;code&gt;Структура типа moduledata_t&lt;/code&gt; (в примере -&lt;code&gt; hello_conf&lt;/code&gt;). Тип &lt;code&gt;moduledata_t&lt;/code&gt; определен в &lt;code&gt;&amp;lt;sys/module.h&amp;gt;&lt;/code&gt;. Об этом ниже&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sub&lt;/code&gt;. Интерфейс подсистемы, который определяет тип модуля.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;order&lt;/code&gt;. Определяет порядок инициализации модулей в рамках определенной подсистемы.&lt;/li&gt;
&lt;/ol&gt;Тип &lt;code&gt;moduledata&lt;/code&gt; - это структура, содержащая переменную char, которая определяет имя, и обработчик события, определенный как структура modeventhand_t (определен в &lt;code&gt;&amp;lt;sys/module.h&amp;gt;&lt;/code&gt;). Также &lt;code&gt;moduledata&lt;/code&gt; содержит указатель типа void для дополнительных данных, который не будет использоваться.&lt;br /&gt;
Теперь у нас есть вся информация, пора её структурировать примером. Создайте файл &lt;code&gt;hello_fsm.c&lt;/code&gt; в дирректории с Makefile'ом.&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/param.h&amp;gt;&amp;nbsp;&lt;br /&gt;
#include &amp;lt;sys/module.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/kernel.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/systm.h&amp;gt;&lt;/blockquote&gt;Теперь нужно написать функцию, которую ядро вызовет и создаст событие&lt;code&gt; MOD_LOAD&lt;/code&gt; или &lt;code&gt;MOD_UNLOAD&lt;/code&gt; используя &lt;code&gt;event &lt;/code&gt;параметр . Если все пойдёт как задуманно, то она вернет 0. &lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre&gt;/* Функция, вызываемая при load/unload. */
static int event_handler(struct module *module, int event, void *arg) {
        int e = 0; /* 0 при нормальном завершении */
        switch (event) {
        case MOD_LOAD:
                uprintf("Hello World! \n");
                break;
        case MOD_UNLOAD:
                uprintf("Goodbye World!\n");
                break;
        default:
                e = EOPNOTSUPP; /* Ошибка */
                break;
        }
       
        return(e);
}&lt;/pre&gt;&lt;/blockquote&gt;Теперь нужно определить второй параметр макроса DECLARE_MODULE, который имеет тип moduledata_t. Здесь вводятся имя и функция, которая будет вызвана при загрузке и выгрузке ядра.&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;pre&gt;static moduledata_t hello_conf = {
    "hello_fsm",    /* Имя модуля */
     event_handler,  /* Обработчик события */
     NULL            /* Дополнительные данные */
};&lt;/pre&gt;&lt;/blockquote&gt;И наконец вызываем &lt;code&gt;DECLARE_MODULE&lt;/code&gt; &lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;div&gt;&lt;pre&gt;DECLARE_MODULE(hello_fsm, hello_conf, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;Теперь можно скомпилировать модуль&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;div&gt;&lt;pre&gt;make&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&lt;pre&gt;sudo kldload ./hello_fsm.ko&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
Должно появиться сообщение "Hello World!"&lt;br /&gt;
&lt;br /&gt;
Источник: &lt;a href="http://www.freesoftwaremagazine.com/articles/writing_a_kernel_module_for_freebsd" target="_blank"&gt;http://www.freesoftwaremagazine.com/&lt;/a&gt;&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2012/01/freebsd.html</link><author>noreply@blogger.com (Александр)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-8249424277689876895</guid><pubDate>Tue, 13 Dec 2011 14:16:00 +0000</pubDate><atom:updated>2011-12-13T21:16:34.676+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Кодинг</category><title>Потоки в C</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;b&gt;Многопоточность&lt;/b&gt; очень важна при высокой нагрузке на машину, когда важно быстро обрабатывать поступающую информацию. В этой статье я хочу рассказать о потоках на конкретном примере. Будут рассмотрены основные функции для работы с потоками. Более полная информация доступна на man странице &lt;b&gt;pthread&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;Итак, приступим. Программа создает 2 потока, которые выполняют одну и ту же функцию. Вообще говоря, потоков и функций может быть сколько угодно и модифицировать этот пример не составит особого труда. В функции каждый поток выводит свой ID, после чего спит 5 секунд и завершается.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:cpp"&gt;/*Листинг thread.c*/
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;pthread.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

/*Функция для первого потока*/
void *
thread_func(void * arg)
{
&amp;nbsp;&amp;nbsp; &amp;nbsp;pthread_t thread = * (pthread_t *) arg;
&amp;nbsp;&amp;nbsp; &amp;nbsp;/*В качестве аргумента передается ID потока.
&amp;nbsp;&amp;nbsp; &amp;nbsp; Функция pthread_self возвращает тот же ID.
&amp;nbsp;&amp;nbsp; &amp;nbsp; Функция pthread_equal сравнивает ID и
&amp;nbsp;&amp;nbsp; &amp;nbsp; возвращает не-нулевое значение, если они
&amp;nbsp;&amp;nbsp; &amp;nbsp; принадлежат одному потоку.*/
&amp;nbsp;&amp;nbsp; &amp;nbsp;if(pthread_equal(pthread_self(), thread) != 0)
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; fprintf(stderr, "thread: %i\n", (int *) arg); /*Делаем что-нибудь*/
&amp;nbsp;&amp;nbsp; &amp;nbsp;sleep(5);
&amp;nbsp;&amp;nbsp; &amp;nbsp;return NULL;
}

int main(void)
{
&amp;nbsp;&amp;nbsp; &amp;nbsp;pthread_t thread[2];

&amp;nbsp;&amp;nbsp; &amp;nbsp;/*pthread_create создает новый поток. Он записывает ID в thread,
&amp;nbsp;&amp;nbsp; &amp;nbsp; в качестве атрибутов указываем NULL, указываем выполняемую
&amp;nbsp;&amp;nbsp; &amp;nbsp; потоком функцию и передаем &amp;amp;thread[0] как аргумент(если
&amp;nbsp;&amp;nbsp; &amp;nbsp; аргументов много, можно передать их структурой)*/
&amp;nbsp;&amp;nbsp; &amp;nbsp;if(pthread_create(&amp;amp;thread[0], NULL,
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;amp;thread_func, &amp;amp;thread[0]) != 0) {
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fprintf(stderr, "Error(thread1)\n");
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 1;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}

&amp;nbsp;&amp;nbsp; &amp;nbsp;/*Создание второго потока*/
&amp;nbsp;&amp;nbsp; &amp;nbsp;if(pthread_create(&amp;amp;thread[1], NULL,
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;amp;thread_func, &amp;amp;thread[1]) != 0) {
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;fprintf(stderr, "Error(thread2)\n");
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return 1;
&amp;nbsp;&amp;nbsp; &amp;nbsp;}

&amp;nbsp;&amp;nbsp; &amp;nbsp;fprintf(stderr, "Hello World\n");

&amp;nbsp;&amp;nbsp; &amp;nbsp;/*Ждем пока потоки завершатся. Аргументы идут в NULL.
&amp;nbsp;&amp;nbsp; &amp;nbsp; Если этого не сделать, то главная программа завершится
&amp;nbsp;&amp;nbsp; &amp;nbsp; вместе с потоками и они не завершат свою работу как задуманно*/
&amp;nbsp;&amp;nbsp; &amp;nbsp;pthread_join(thread[0], NULL);
&amp;nbsp;&amp;nbsp; &amp;nbsp;pthread_join(thread[1], NULL);
&amp;nbsp;&amp;nbsp; &amp;nbsp;return 0;
}
&lt;/pre&gt;Вот вывод нашей программы:&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_2Q92OQgpN1nXNRDMOhI8RoZjr_YzxjVwaFfN79jsgwWtgv7BW0knH2SprwNq2E1KcD4ZXchsPIGMdNzOTVzWfLYi5_YnK1kRwsbFdK45TltoEGcDyyvfJD0dEVYPRnqteOKltOXDiwI1/s1600/pthread.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="147" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_2Q92OQgpN1nXNRDMOhI8RoZjr_YzxjVwaFfN79jsgwWtgv7BW0knH2SprwNq2E1KcD4ZXchsPIGMdNzOTVzWfLYi5_YnK1kRwsbFdK45TltoEGcDyyvfJD0dEVYPRnqteOKltOXDiwI1/s320/pthread.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Вывод &lt;b&gt;thread&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2011/12/c.html</link><author>noreply@blogger.com (Александр)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_2Q92OQgpN1nXNRDMOhI8RoZjr_YzxjVwaFfN79jsgwWtgv7BW0knH2SprwNq2E1KcD4ZXchsPIGMdNzOTVzWfLYi5_YnK1kRwsbFdK45TltoEGcDyyvfJD0dEVYPRnqteOKltOXDiwI1/s72-c/pthread.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-5545214217081836385</guid><pubDate>Mon, 12 Dec 2011 17:05:00 +0000</pubDate><atom:updated>2011-12-13T15:26:57.309+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Кодинг</category><title>Взаимодействие процессов: pipe()</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Есть ещё один вид &lt;b&gt;взаимодействия процессов&lt;/b&gt; в unix, &lt;b&gt;каналы&lt;/b&gt;.&lt;br /&gt;
Рассмотрим на примере как это работает.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&amp;nbsp;Программа parent создает канал с помощью &lt;b&gt;системного вызова&lt;/b&gt; pipe(), далее приводит дескрипторы чтения и записи к символьному типу, создает форков(новый процесс, выполняющий ту же самую программу, у потомков&lt;b&gt; fork()&lt;/b&gt; возвращает 0), форки вызывают программы src и dst, передавая им дескрипторы записи и чтения соответственно, джёт завершения форков и завершается сама. Программа src передает сообщение с помощью write(), используя дескриптор для записи в канал, который передан ей как аргумент и завершается. Программа dst получает сообщение с помощью read() и выводит его на экран, используя write(). Листинги программ:&lt;br /&gt;
&lt;pre class="brush:cpp"&gt;/*Файл parent.c: порождает двух форков, ждет их завершения, закрывает канал и завершается*/
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;sys/wait.h&amp;gt;

#define STR_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp; 32

int
main(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; int pf[2];
&amp;nbsp;&amp;nbsp;&amp;nbsp; int pid1, pid2;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char spf[2][STR_SIZE];

&amp;nbsp;&amp;nbsp;&amp;nbsp; /*Создание канала. Чтение идет через pf[0], запись - через pf[1]*/
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(pipe(pf) == -1){
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "pipe() error\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; /*Запись дескрипторов для последующей передачи в качестве параметров программам, осуществляющим запись и чтение*/
&amp;nbsp;&amp;nbsp;&amp;nbsp; sprintf(spf[0], "%d", pf[0]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; sprintf(spf[1], "%d", pf[1]);

&amp;nbsp;&amp;nbsp;&amp;nbsp; /*Первый форк вызывает программу src. В качестве параметра передается дескриптор для записи*/
&amp;nbsp;&amp;nbsp;&amp;nbsp; if((pid1 = fork()) == 0){
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; close(pf[0]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; execl("./src", "src",
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; spf[1], NULL);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "exec() [src] error\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; /*Второй форк вызывает программу dst. В качестве параметра передается дескриптор для чтения*/
&amp;nbsp;&amp;nbsp;&amp;nbsp; if((pid2 = fork()) == 0){
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; close(pf[1]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; execl("./dst", "dst",
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; spf[0], NULL);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "exec() [dst] error\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; /*Ждем и завершаемся*/
&amp;nbsp;&amp;nbsp;&amp;nbsp; waitpid(pid1, NULL, 0);
&amp;nbsp;&amp;nbsp;&amp;nbsp; close(pf[0]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; close(pf[1]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; waitpid(pid2, NULL, 0);
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;
}
&lt;/pre&gt;&lt;pre class="brush:cpp"&gt;/*Листинг src.c*/
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

#define PP_MESSAGE&amp;nbsp;&amp;nbsp;&amp;nbsp; "Hello World\n"
#define WAIT_SECS&amp;nbsp;&amp;nbsp;&amp;nbsp; 5

int
main(int argc, char ** argv)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; int i, fd;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(argc &amp;lt; 2){
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "src: Too few arguments\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; fd = atoi(argv[1]);

&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "Wait please");
&amp;nbsp;&amp;nbsp;&amp;nbsp; for(i = 0; i &amp;lt; WAIT_SECS; i++, sleep (1))
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, ".");
&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(write (fd, PP_MESSAGE,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; strlen(PP_MESSAGE)) == -1){
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "src: write() error\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; close(fd);
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;
}
&lt;/pre&gt;&lt;pre class="brush:cpp"&gt;/*Листинг dst,c*/
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;

int
main(int argc, char ** argv)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; int fd;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char ch;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(argc &amp;lt; 2){
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "dst: Too few arguments\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; fd = atoi(argv[1]);
&amp;nbsp;&amp;nbsp;&amp;nbsp; while(read(fd, &amp;amp;ch, 1) &amp;gt; 0)
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; write(1, &amp;amp;ch, 1);

&amp;nbsp;&amp;nbsp;&amp;nbsp; close(fd);
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;
}
&lt;/pre&gt;Вот что получается в результате наших махинаций:&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinVnponIMgLmEOYjVzzCJ_vvVONpeRpMRTNXJmowhzToOX0Qn0ND9tlPcYtodvxBmYuspNQALy-fKAQ6Q2PtLt4x5aLSIw7SyYdCHxNujQr1FebDLdLkh7xRxbFILMMZ_gLh7-6jNDwEeM/s1600/%25D0%2592%25D1%258B%25D0%25B7%25D0%25BE%25D0%25B2+pipe.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="139" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinVnponIMgLmEOYjVzzCJ_vvVONpeRpMRTNXJmowhzToOX0Qn0ND9tlPcYtodvxBmYuspNQALy-fKAQ6Q2PtLt4x5aLSIw7SyYdCHxNujQr1FebDLdLkh7xRxbFILMMZ_gLh7-6jNDwEeM/s320/%25D0%2592%25D1%258B%25D0%25B7%25D0%25BE%25D0%25B2+pipe.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Системный вызов pipe()&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2011/12/pipe.html</link><author>noreply@blogger.com (Александр)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinVnponIMgLmEOYjVzzCJ_vvVONpeRpMRTNXJmowhzToOX0Qn0ND9tlPcYtodvxBmYuspNQALy-fKAQ6Q2PtLt4x5aLSIw7SyYdCHxNujQr1FebDLdLkh7xRxbFILMMZ_gLh7-6jNDwEeM/s72-c/%25D0%2592%25D1%258B%25D0%25B7%25D0%25BE%25D0%25B2+pipe.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-3044328474292855827</guid><pubDate>Sat, 03 Dec 2011 17:35:00 +0000</pubDate><atom:updated>2011-12-04T17:50:42.165+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Железо</category><title>NVidia drivers под FreeBSD x64</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;a href="http://www.nvidia.ru/object/freebsd-x64-290.10-driver-ru.html" target="_blank"&gt;http://www.nvidia.ru/object/freebsd-x64-290.10-driver-ru.html&lt;/a&gt;&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;&lt;b&gt;Инструкции по установке:&lt;/b&gt; после загрузки драйвера перейдите в  каталог, содержащий пакет драйвера и установите его, запустив командой  tar xzf NVIDIA-FreeBSD-x86_64-290.10.tar.gz &amp;amp;&amp;amp; cd  NVIDIA-FreeBSD-x86_64-290.10 &amp;amp;&amp;amp; make install Затем измените конфигурационный файл с учётом использования драйвера NVIDIA X; это  обычно осуществляется запуском nvidia-xconfig &lt;/blockquote&gt;&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2011/12/nvidia-drivers-freebsd-x64.html</link><author>noreply@blogger.com (Александр)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-6679753296921158003</guid><pubDate>Sat, 03 Dec 2011 17:09:00 +0000</pubDate><atom:updated>2011-12-04T00:11:13.549+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Настройка</category><title>Перевод логов с первого терминала</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;По умолчанию логи выводятся на первый терминал, что не всегда удобно. Можно легко сменить терминал, в который будут писаться логи.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="color: white;"&gt;Отключаем n-ный терминал(здесь - седьмой). Для этого в файле&lt;b&gt; &lt;/b&gt;&lt;b&gt;/etc/ttys&lt;/b&gt; нужно изменить в строке&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;blockquote class="tr_bq" style="color: white;"&gt;&lt;span style="font-family: courier new; font-size: 85%;"&gt;ttyv7   "/usr/libexec/getty Pc"         cons25r &lt;b style="font-weight: normal;"&gt;on&lt;/b&gt;  secure&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;div style="color: white;"&gt;on на off &lt;/div&gt;&lt;div style="color: white;"&gt;Для настройки syslog ищем файл &lt;b&gt;/etc/syslog.conf&lt;/b&gt; и меняем строку&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;blockquote class="tr_bq" style="color: white;"&gt;&lt;span style="font-family: courier new; font-size: 85%;"&gt;.*err;kern.warning;auth.notice;mail.crit               /dev/console&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="color: white;"&gt;на&lt;/div&gt;&lt;div style="color: white;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;blockquote class="tr_bq" style="color: white;"&gt;&lt;span style="font-family: courier new; font-size: 85%;"&gt;*.*.err;kern.warning;auth.notice;mail.crit               /dev/ttyv8&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="color: white;"&gt;Далее перезапускаем&lt;/div&gt;&lt;blockquote class="tr_bq" style="color: white;"&gt;&lt;span style="font-family: courier new; font-size: 85%;"&gt;# /etc/rc.d/syslogd restart&lt;/span&gt;&lt;/blockquote&gt;&lt;div style="color: white;"&gt;Готово&lt;/div&gt;&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2011/12/blog-post.html</link><author>noreply@blogger.com (Александр)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-7120292188649194470</guid><pubDate>Tue, 29 Nov 2011 16:33:00 +0000</pubDate><atom:updated>2011-11-29T23:42:12.701+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Кодинг</category><title>Семафоры</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;В этой статье я опишу ещё один способ &lt;b&gt;взаимодействия процессов&lt;/b&gt;.&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;b&gt;Семафоры&lt;/b&gt; нужны чтобы предотвратить конфликты. Перед тем как воспользоваться доступом к ресурсу, процесс устанавливает семафор, чтобы занять место. Если семафор уже установлен другим процессом, текущий блокируется, пока ресурс не освободится.&lt;br /&gt;
Функции, которые мы будем использовать:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;int semget(key_t KEY, int SEMS, int FLAGS);&lt;/li&gt;
&lt;/ul&gt;Создает набор семафоров с ключем KEY и флагами FLAGS, SEMS - количество семафоров. Возвращает ID.&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;int semop(int ID, struct sembuf* SB, size_t SIZE);&lt;/li&gt;
&lt;/ul&gt;&amp;nbsp;Позволяет совершать операции над набором семафоров с идентификатором ID. Структура sembuf:&lt;br /&gt;
&lt;pre class="brush:cpp"&gt;struct sembuf {
&amp;nbsp;&amp;nbsp; unsigned short int sem_num; /* номер семафора */
&amp;nbsp;&amp;nbsp; short int sem_op; /* равен -1 если процесс собирается использовать ресурс, 1 - если ресурс свободен */
&amp;nbsp;&amp;nbsp; short int sem_flg; /* флаги для операции над семафорами */
};
&lt;/pre&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;int semctl(int ID, int SNUM, int COMMAND, union semnum sem_arg);&lt;/li&gt;
&lt;/ul&gt;Обычно служит для инициализации и удаления семафоров. SNUM - номер семафора. COMMAND может равняться SETALL(для инициализации) и IPC_RMID(для удаления).&lt;br /&gt;
&lt;pre class="brush:cpp"&gt;union semnum {
&amp;nbsp;&amp;nbsp; int val;
&amp;nbsp;&amp;nbsp; struct semid_ds* buf;
&amp;nbsp;&amp;nbsp; unsigned short* array;
};
&lt;/pre&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Использование семафоров&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
&lt;pre class="brush:cpp"&gt;/* Файл owner.c - запись данных в память */
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;sys/shm.h&amp;gt;
#include &amp;lt;sys/sem.h&amp;gt;

#define SHMEM_SIZE&amp;nbsp;&amp;nbsp;&amp;nbsp; 4096
#define SH_MESSAGE&amp;nbsp;&amp;nbsp;&amp;nbsp; "test\n"

#define SEM_KEY&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 2012
#define SHM_KEY&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 2012

union semnum {
&amp;nbsp;&amp;nbsp;&amp;nbsp; int val;
&amp;nbsp;&amp;nbsp;&amp;nbsp; struct semid_ds * buf;
&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned short * array;
} sem_arg;


int
main(void)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; int shm_id, sem_id;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char * shm_buf;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int shm_size;
&amp;nbsp;&amp;nbsp;&amp;nbsp; struct shmid_ds ds;
&amp;nbsp;&amp;nbsp;&amp;nbsp; struct sembuf sb[1];
&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned short sem_vals[1];
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; shm_id = shmget(SHM_KEY, SHMEM_SIZE,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IPC_CREAT | IPC_EXCL | 0600);

&amp;nbsp;&amp;nbsp;&amp;nbsp; if(shm_id == -1)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "shmget()\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; sem_id = semget(SEM_KEY, 1,
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; 0600 | IPC_CREAT | IPC_EXCL);

&amp;nbsp;&amp;nbsp;&amp;nbsp; if(sem_id == -1)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "semget()\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Semaphore: %d\n", sem_id);
&amp;nbsp;&amp;nbsp;&amp;nbsp; sem_vals[0] = 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; sem_arg.array = sem_vals;

&amp;nbsp;&amp;nbsp;&amp;nbsp; if(semctl (sem_id, 0, SETALL, sem_arg) == -1)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "semctl() error\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; shm_buf = (char *) shmat(shm_id, NULL, 0);
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (shm_buf == (char *) -1)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "shmat() error\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; shmctl(shm_id, IPC_STAT, &amp;amp;ds);
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; shm_size = ds.shm_segsz;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(shm_size &amp;lt; strlen(SH_MESSAGE))
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "error: segsize=%d\n", shm_size);
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; strcpy(shm_buf, SH_MESSAGE);

&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("ID: %d\n", shm_id);
&amp;nbsp;&amp;nbsp;&amp;nbsp; 


&amp;nbsp;&amp;nbsp;&amp;nbsp; sb[0].sem_num = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; sb[0].sem_flg = SEM_UNDO;

&amp;nbsp;&amp;nbsp;&amp;nbsp; sb[0].sem_op = -1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; semop(sem_id, sb, 1);

&amp;nbsp;&amp;nbsp;&amp;nbsp; sb[0].sem_op = -1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; semop(sem_id, sb, 1);

&amp;nbsp;&amp;nbsp;&amp;nbsp; semctl(sem_id, 1, IPC_RMID, sem_arg);
&amp;nbsp;&amp;nbsp;&amp;nbsp; shmdt(shm_buf);
&amp;nbsp;&amp;nbsp;&amp;nbsp; shmctl(shm_id, IPC_RMID, NULL);

&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;
}
&lt;/pre&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:cpp"&gt;/* Файл user.c - чтение данных из памяти */
#include &amp;lt;sys/shm.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;sys/sem.h&amp;gt;

#define SEM_KEY 2012
#define SHM_KEY 2012

int
main(int argc, char ** argv)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; int shm_id, sem_id;
&amp;nbsp;&amp;nbsp;&amp;nbsp; char * shm_buf;
&amp;nbsp;&amp;nbsp;&amp;nbsp; struct sembuf sb[1];

&amp;nbsp;&amp;nbsp;&amp;nbsp; shm_id = shmget(SHM_KEY, 1, 0600);
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(shm_id == -1)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "shmget() error\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; sem_id = semget(SEM_KEY, 1, 0600);
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(sem_id == -1)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "semget() error\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; shm_buf = (char *) shmat(shm_id, 0, 0);
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(shm_buf == (char *) -1)
&amp;nbsp;&amp;nbsp;&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "shmat() error\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Message: %s\n", shm_buf);

&amp;nbsp;&amp;nbsp;&amp;nbsp; sb[0].sem_num = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; sb[0].sem_flg = SEM_UNDO;

&amp;nbsp;&amp;nbsp;&amp;nbsp; sb[0].sem_op = 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; semop(sem_id, sb, 1);
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; shmdt(shm_buf);

&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;
}
&lt;/pre&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicQX80vd0IbmPgRo46Mi6WjvxdzEHXEuNVXspy9bp59_rN4WuQSjtzVgM9Hi5VNG-pvyjZYLPrFlDHxzeWJFPMuUmwOmWaSU1Ezv6cUFDurQKhmVY2Ajwk9EQq33pQW4PYyl86kZCzSJww/s1600/%25D0%25A1%25D0%25B5%25D0%25BC%25D0%25B0%25D1%2584%25D0%25BE%25D1%2580%25D1%258B+-+owner.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicQX80vd0IbmPgRo46Mi6WjvxdzEHXEuNVXspy9bp59_rN4WuQSjtzVgM9Hi5VNG-pvyjZYLPrFlDHxzeWJFPMuUmwOmWaSU1Ezv6cUFDurQKhmVY2Ajwk9EQq33pQW4PYyl86kZCzSJww/s320/%25D0%25A1%25D0%25B5%25D0%25BC%25D0%25B0%25D1%2584%25D0%25BE%25D1%2580%25D1%258B+-+owner.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Семафоры - owner&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF3oP4E_LiUs_WX_YVZGDrIM3LedOJD89mBnFK3Mu157APGbSSdzrPXLkMGsUuHhgM3WyS17sgyXrnZfY2v2w72BpXeiZJM8Y7JJGEUJ_xmEH1i0p5Fto2zVJDzXY9LnJQpgORtyUNY0Lu/s1600/%25D0%25A1%25D0%25B5%25D0%25BC%25D0%25B0%25D1%2584%25D0%25BE%25D1%2580%25D1%258B+-+user.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF3oP4E_LiUs_WX_YVZGDrIM3LedOJD89mBnFK3Mu157APGbSSdzrPXLkMGsUuHhgM3WyS17sgyXrnZfY2v2w72BpXeiZJM8Y7JJGEUJ_xmEH1i0p5Fto2zVJDzXY9LnJQpgORtyUNY0Lu/s320/%25D0%25A1%25D0%25B5%25D0%25BC%25D0%25B0%25D1%2584%25D0%25BE%25D1%2580%25D1%258B+-+user.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Семафоры - user&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;
Функции, которые не описанны в этой статье, описаны в статье&amp;nbsp; &lt;a href="http://nix-blog-1.blogspot.com/2011/11/blog-post_27.html" target="_blank"&gt;Использование общей памяти&lt;/a&gt;&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2011/11/blog-post_29.html</link><author>noreply@blogger.com (Александр)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicQX80vd0IbmPgRo46Mi6WjvxdzEHXEuNVXspy9bp59_rN4WuQSjtzVgM9Hi5VNG-pvyjZYLPrFlDHxzeWJFPMuUmwOmWaSU1Ezv6cUFDurQKhmVY2Ajwk9EQq33pQW4PYyl86kZCzSJww/s72-c/%25D0%25A1%25D0%25B5%25D0%25BC%25D0%25B0%25D1%2584%25D0%25BE%25D1%2580%25D1%258B+-+owner.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-4710464534433890934</guid><pubDate>Sun, 27 Nov 2011 14:52:00 +0000</pubDate><atom:updated>2011-11-29T23:29:31.554+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Кодинг</category><title>Использование общей памяти</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Есть много способов обеспечить &lt;b&gt;взаимодействие процессов&lt;/b&gt;, в этой статье я расскажу об одном из них, об использовании общей памяти.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;Функции, которые мы будем использовать:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;int shmget(key_t KEY, size_t SIZE, int FLAGS); &lt;/li&gt;
&lt;/ul&gt;Функция, выделяющая общую память. Возвращает идентефикатор сегмента или -1.&lt;br /&gt;
Аргументы:&lt;br /&gt;
KEY - ключ сегмента. Константа IPC_PRIVATE инициирует динамическое выделение ключа.&lt;br /&gt;
SIZE - Запрашиваемое число байт для сегмента.&lt;br /&gt;
FLAGS - Права доступа к сегменту. Также есть дополнительные флаги: IPC_CREAT - создать, IPC_EXCL - написать что сегмент уже создан.&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;void* shmat(int ID, void* ADDRESS, int FLAGS);&lt;/li&gt;
&lt;/ul&gt;Функция для получения доступа к выделенному сегменту. Возвращает адрес или (void *) -1.&lt;br /&gt;
Аргументы:&lt;br /&gt;
ID - идентификатор сегмента.&amp;nbsp; &lt;br /&gt;
ADDRESS - адрес, по которому доступен сегмент. В случае NULL выбирается произвольный.&lt;br /&gt;
FLAGS - дополнительные флаги.&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;shmdt(void* ADDRESS);&lt;/li&gt;
&lt;/ul&gt;Функция для завершения работы с общей памятью. Возвращает 0 или -1(при ошибке).&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;int shmctl(int ID, int COMMAND, struct shmid_ds * DESC);&lt;/li&gt;
&lt;/ul&gt;Функция для осуществления различных операций над памятью . Возвращает 0 или -1.&lt;br /&gt;
Аргументы:&lt;br /&gt;
ID - идентификатор сегмента.&lt;br /&gt;
COMMAND - выполняемая команда, часто это IPC_STAT - получить данные и IPC_RMID - удалить сегмент.&lt;br /&gt;
DESC - указатель на структуру, в которую заносятся данные о сегменте. Для IPC_RMID достаточно NULL.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Использование общей памяти&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Рассмотрим пример:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
owner создаёт общий сегмент с импользование ключа IPC_PRIVATE, заносит туда данные и открывает доступ к нему для всех желающих. user подключается, используя ключ сегмента и читает данные из сегмента.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="brush:cpp"&gt;/* Файл owner.c */
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;sys/shm.h&amp;gt;

#define SHMEM_SIZE 4096
#define SH_MESSAGE "test\n"

int
main(void)
{
&amp;nbsp; int shm_id, shm_size;
&amp;nbsp; char* shm_buf;
&amp;nbsp; struct shmid_ds ds;

&amp;nbsp; shm_id = shmget(IPC_PRIVATE, SHMEM_SIZE, IPC_CREAT | IPC_EXCL | 0600);
&amp;nbsp; if(shm_id == -1)
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "shmget()\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp; }

&amp;nbsp; shm_buf = (char *) shmat(shm_id, NULL, 0);
&amp;nbsp; if(shm_buf == (char *) -1)
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "shmat()\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp; }

&amp;nbsp; shmctl(shm_id, IPC_STAT, &amp;amp;ds);

&amp;nbsp; shm_size = ds.shm_segsz;
&amp;nbsp; if(shm_size &amp;lt; strlen(SH_MESSAGE))
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "error\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp; }

&amp;nbsp; strcpy(shm_buf, SH_MESSAGE);

&amp;nbsp; printf("ID: %d\n", shm_id);
&amp;nbsp; printf("Enter");
&amp;nbsp; fgetc(stdin);

&amp;nbsp; shmdt(shm_buf);
&amp;nbsp; shmctl(shm_id, IPC_RMID, NULL);

&amp;nbsp; return 0;
}&amp;nbsp; 
&lt;/pre&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre class="brush:cpp"&gt;/* Файл user.c */
#include &amp;lt;sys/shm.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;

int
main(int argc, char ** argv)
{
&amp;nbsp; int shm_id;
&amp;nbsp; char* shm_buf;
&amp;nbsp; 
&amp;nbsp; if(argc &amp;lt; 2)
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "error(argc)\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp; }

&amp;nbsp; shm_id = atoi(argv[1]);
&amp;nbsp; shm_buf = (char *) shmat(shm_id, 0, 0);
&amp;nbsp; if(shm_buf == (char*) -1)
&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr, "shmat()\n");
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;
&amp;nbsp; }

&amp;nbsp; printf("%s\n", shm_buf);
&amp;nbsp; shmdt(shm_buf);

&amp;nbsp; return 0;
}
&lt;/pre&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
Вот что получилось:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIPWgHynAYtc-zc-2BkGLcIsUV641D_DME45eCtTNZwplXYAbXXmnYJI7f3OH2eJdNdMVUboeaIbvDXZJfBpP0QPoD6gtNsZUalvCdRYM6WsPoU_8mE-p91Kw6o4FEKMScyGRvlFsi1nSA/s1600/%25D0%2598%25D1%2581%25D0%25BF%25D0%25BE%25D0%25BB%25D1%258C%25D0%25B7%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BE%25D0%25B1%25D1%2589%25D0%25B5%25D0%25B9+%25D0%25BF%25D0%25B0%25D0%25BC%25D1%258F%25D1%2582%25D0%25B8+-+owner.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="Использование общей памяти" border="0" height="159" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIPWgHynAYtc-zc-2BkGLcIsUV641D_DME45eCtTNZwplXYAbXXmnYJI7f3OH2eJdNdMVUboeaIbvDXZJfBpP0QPoD6gtNsZUalvCdRYM6WsPoU_8mE-p91Kw6o4FEKMScyGRvlFsi1nSA/s320/%25D0%2598%25D1%2581%25D0%25BF%25D0%25BE%25D0%25BB%25D1%258C%25D0%25B7%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BE%25D0%25B1%25D1%2589%25D0%25B5%25D0%25B9+%25D0%25BF%25D0%25B0%25D0%25BC%25D1%258F%25D1%2582%25D0%25B8+-+owner.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Использование общей памяти - owner&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;
&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-2hOKkfx9BflCru3wnWxoKiiwsL-bcFFgL-m-vEv6bb-caPbG-IDTpmpBojX-hBn7ggDDHNQ6wsKlWwtBvB-AvRduqYCHL3f0n4rZlmAY84zinbzlQKm2BegKQGHhrkzGd2ZYNYQjw9va/s1600/%25D0%2598%25D1%2581%25D0%25BF%25D0%25BE%25D0%25BB%25D1%258C%25D0%25B7%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BE%25D0%25B1%25D1%2589%25D0%25B5%25D0%25B9+%25D0%25BF%25D0%25B0%25D0%25BC%25D1%258F%25D1%2582%25D0%25B8+-+user.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="Использование общей памяти" border="0" height="160" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-2hOKkfx9BflCru3wnWxoKiiwsL-bcFFgL-m-vEv6bb-caPbG-IDTpmpBojX-hBn7ggDDHNQ6wsKlWwtBvB-AvRduqYCHL3f0n4rZlmAY84zinbzlQKm2BegKQGHhrkzGd2ZYNYQjw9va/s320/%25D0%2598%25D1%2581%25D0%25BF%25D0%25BE%25D0%25BB%25D1%258C%25D0%25B7%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BE%25D0%25B1%25D1%2589%25D0%25B5%25D0%25B9+%25D0%25BF%25D0%25B0%25D0%25BC%25D1%258F%25D1%2582%25D0%25B8+-+user.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Использование общей памяти - user&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Система: &lt;b&gt;FreeBSD 8.2&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2011/11/blog-post_27.html</link><author>noreply@blogger.com (Александр)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIPWgHynAYtc-zc-2BkGLcIsUV641D_DME45eCtTNZwplXYAbXXmnYJI7f3OH2eJdNdMVUboeaIbvDXZJfBpP0QPoD6gtNsZUalvCdRYM6WsPoU_8mE-p91Kw6o4FEKMScyGRvlFsi1nSA/s72-c/%25D0%2598%25D1%2581%25D0%25BF%25D0%25BE%25D0%25BB%25D1%258C%25D0%25B7%25D0%25BE%25D0%25B2%25D0%25B0%25D0%25BD%25D0%25B8%25D0%25B5+%25D0%25BE%25D0%25B1%25D1%2589%25D0%25B5%25D0%25B9+%25D0%25BF%25D0%25B0%25D0%25BC%25D1%258F%25D1%2582%25D0%25B8+-+owner.png" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-1370022811407403437</guid><pubDate>Fri, 25 Nov 2011 17:23:00 +0000</pubDate><atom:updated>2011-11-26T00:24:19.590+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Железо</category><title>Отключение бипера</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;При любом гудке хватаюсь за сердце и начинаю нервничать, всё потому что когда-то 3 месяца не доходили руки отключить бипер и он противно гудел при работе в консоле&lt;br /&gt;
&lt;code&gt;# sysctl hw.syscons.bell=0&lt;/code&gt;&lt;code&gt;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;# echo "hw.syscons.bell=0" &amp;gt;&amp;gt; /etc/sysctl.conf&lt;/code&gt;&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2011/11/blog-post_26.html</link><author>noreply@blogger.com (Александр)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-709086086433456669</guid><pubDate>Wed, 23 Nov 2011 13:03:00 +0000</pubDate><atom:updated>2011-12-13T20:35:46.489+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SEO</category><title>SEO продвижение блога</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&amp;nbsp;Совсем недавно завёл свой блог, сразу же столкнулся с проблемой &lt;b&gt;поисковой оптимизации&lt;/b&gt;. Полез в интернет за информацией. Инфы было море, но большинство статей либо устарело, либо было трудно для понимания новичку. Вобщем, на то чтобы перелопатить всё это ушло время. В этой статье я опишу правила написания статей, которые я усвоил, а так же вкратце напишу о других методах поисковой оптимизации.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;span style="font-size: large;"&gt;ВЧ СЧ НЧ запросы&lt;/span&gt;&lt;br /&gt;
Итак, для начала необходимо составить список ключевых слов. Запросы делятся на низкочастотные, среднечастотные, высокочастотные. Основной трафик идёт с низко и среднечастотных запросов, т.к. высокочастотные имеют большую конкуренцию. Поэтому я бы посоветовал &lt;b&gt;продвигать сайт &lt;/b&gt;используя ключевые слова для низко и среднечастотных запросов.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Как подобрать ключевые слова&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Ключевые слова можно подобрать с помощью &lt;a href="https://adwords.google.com/o/Targeting/Explorer?__u=1000000000&amp;amp;__c=1000000000&amp;amp;ideaRequestType=KEYWORD_IDEAS#search.none"&gt;статистики Google&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;. У Яндекса тоже есть &lt;a href="http://wordstat.yandex.ru/"&gt;своя статистика&lt;/a&gt;, но её использовать не рекомендуют.&lt;br /&gt;
При выборе ключевых слов, уделите внимание вопросительным формам запросов. Также не забудьте что, например, запросы "как писать ключевые слова" и "ключевые слова как писать" дадут разные результаты. После того как ключевые слова подобраны, можно приступить к написанию статьи. Вообще говоря, можно оптимизировать уже написанную статью, но это будет несколько сложнее.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Куда вставлять ключевые слова&lt;/span&gt;&lt;br /&gt;
Вес ключевых слов увеличивается, если они присутствуют:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;в URL сайта - здесь готовые блоги уже оптимизированны&lt;/li&gt;
&lt;li&gt;Теге title. Для блогов это как правило название самого блога + название статьи. Не советуется использовать слишком длинные названия статьи и/или насыщать их ключевыми словами&lt;/li&gt;
&lt;li&gt;В заголовках, обозначаемых тегами h1...h6. На blogger в статью можно вставить заголовки не выше h3.&lt;/li&gt;
&lt;li&gt; В тегах strong(логическое выделение) и b(обычное выделение жирным цветом). Хотя насчёт b точной информации я не нашел. На blogger тег strong автоматически заменяется на b.&lt;/li&gt;
&lt;li&gt;В теге alt при вставке картинок и в анкорах ссылок при вставке ссылок для перелинковки(расстановка ссылок в целях перераспределения веса страниц сайта)&lt;/li&gt;
&lt;li&gt;В начале или конце абзаца. Но это не значит что нужно лепить все ключевики в самом начале, будет лучше распределить их по всему тексту.&lt;/li&gt;
&lt;li&gt;Некоторые говорят что теги description и &amp;lt;meta keywords="..."&amp;gt; повышают вес ключевых слов, но в &lt;a href="http://www.google.ru/url?sa=t&amp;amp;rct=j&amp;amp;q=%20%20google%20search%20engine%20optimization%20starter%20guide%202010&amp;amp;source=web&amp;amp;cd=1&amp;amp;ved=0CCoQFjAA&amp;amp;url=http%3A%2F%2Fwww.google.com%2Fwebmasters%2Fdocs%2Fsearch-engine-optimization-starter-guide.pdf&amp;amp;ei=CuXMTuiXIcza4QS6yZRd&amp;amp;usg=AFQjCNEMj8KHxhxQz9cMLoMxMDiLdrAbJw&amp;amp;cad=rjt"&gt;руководстве Google по поисковой оптимизации&lt;/a&gt; сказано что description используется толкьо для создания сниппетов(краткого описания), а про keywords вообще ничего не написано. На blogger описание(тег description) можно задать только для блога, но не для каждой страницы&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;Но не забывайте, что чем больше на странице ключевых слов, тем меньше их значение.&lt;br /&gt;
Также рекомендуется использовать символы — и «» вместо - и "". Будет плюсом, если в статье присутствуют картинки.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Другие методы seo&lt;/span&gt; &lt;span style="font-size: large;"&gt;продвижения&lt;/span&gt;&lt;br /&gt;
&lt;b&gt;Белое SEO&lt;/b&gt;:&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;&lt;li&gt;Добавление ключевых слов&lt;/li&gt;
&lt;li&gt;Облегчение доступа на сайт для бота(например, создание карты сайта)&lt;/li&gt;
&lt;li&gt;Внутренняя перелинковка&lt;/li&gt;
&lt;li&gt;Добавление внешних ссылок(RSS агрегаторы, рейтинги и прочее) &lt;/li&gt;
&lt;li&gt;Прогон по белым каталогам&lt;/li&gt;
&lt;/ul&gt;&lt;b&gt;Черное SEO: &lt;/b&gt;Думаю, вы и сами без проблем сможете найти методы черного SEO, но помните, что как правило такие сайты быстро выкидывают из индексации.&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2011/11/seo.html</link><author>noreply@blogger.com (Александр)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-2735195757252370539</guid><pubDate>Thu, 17 Nov 2011 15:02:00 +0000</pubDate><atom:updated>2011-11-23T19:15:43.672+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Кодинг</category><title>Протокол ICMP</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span style="font-size: large;"&gt;Вступление&lt;/span&gt;&lt;br /&gt;
В этой статье мы рассмотрим пример как сформировать и послать ICMP пакет средствами языка C на системе &lt;b&gt;FreeBSD 8.2&lt;/b&gt; используя BSD RAW сокеты.&amp;nbsp; Данный пример скомпилируется и под любой другой Unix-подобной системой, но для этого придётся внести некоторые поправки(см. комментарии к коду)&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Модель OSI&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;ICMP &lt;/span&gt;&lt;/span&gt;—&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt; это протокол сетевого уровня, работающий поверх IP протокола.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Протокол IP&lt;/b&gt; содержит следующие поля:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;Название&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Длина(бит)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;pre class="SCREEN"&gt;Version                          4
Header length                    4
Type of Service                  8
Total length                    16
Identification                  16
Flags                            3
Offset                         13
Time to Live                     8
Protocol                         8
Checksum                        16
Source IP address               32
Destination IP address          32&lt;/pre&gt;&lt;pre class="SCREEN"&gt;Data &lt;/pre&gt;&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;В поле Data будет находиться наш ICMP пакет, который в свою очередь содержит поля:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;type, code, id, seq, cksum. Их размеры варьируются&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-size: large;"&gt;Программная реализация&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
Как я уже писал, мы будем использовать RAW сокеты, собирая наш пакет по байтам, т.к. обычные сокеты не предоставляют возможности использовать ICMP протокол. Поэтому, например, в &lt;b&gt;утилите ping&lt;/b&gt; используются RAW сокеты заместо обычных.&lt;br /&gt;
&lt;br /&gt;
Приступим&lt;br /&gt;
&lt;pre class="brush:sql"&gt;/* Файл ICMP.c */
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;netdb.h&amp;gt;

#include &amp;lt;sys/types.h&amp;gt;
#include &amp;lt;sys/stat.h&amp;gt;
#include &amp;lt;sys/socket.h&amp;gt;

#include &amp;lt;netinet/in_systm.h&amp;gt;
#include &amp;lt;netinet/in.h&amp;gt;
#include &amp;lt;netinet/ip.h&amp;gt;
#include &amp;lt;netinet/udp.h&amp;gt;
#include &amp;lt;netinet/ip_icmp.h&amp;gt;
#include &amp;lt;netinet/tcp.h&amp;gt;

#include &amp;lt;arpa/inet.h&amp;gt;

/* Функция для расчёта контрольной суммы. Суммируем значения 
переданных данных, разбив данные на куски по 2 байта
(u_short весит 2 байта, суммирование осуществляется в while). 
Если остался 1 символ лишний - прибавляем его к получившемуся 
значению. Сдвигаем результат на 16 разрядов(2 байта) вправо, 
прибавляя вытесненные разряды. Инвертируем и получаем 
контрольную сумму */
u_short
in_cksum(addr, len)
&amp;nbsp;&amp;nbsp;&amp;nbsp; u_short *addr;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int len;
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; int nleft, sum;
&amp;nbsp;&amp;nbsp;&amp;nbsp; u_short *w;
&amp;nbsp;&amp;nbsp;&amp;nbsp; union {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; u_short&amp;nbsp;&amp;nbsp;&amp;nbsp; us;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; u_char&amp;nbsp;&amp;nbsp;&amp;nbsp; uc[2];
&amp;nbsp;&amp;nbsp;&amp;nbsp; } last;
&amp;nbsp;&amp;nbsp;&amp;nbsp; u_short answer;
&amp;nbsp;&amp;nbsp;&amp;nbsp; nleft = len;
&amp;nbsp;&amp;nbsp;&amp;nbsp; sum = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; w = addr;
&amp;nbsp;&amp;nbsp;&amp;nbsp; while (nleft &amp;gt; 1)&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sum += *w++;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; nleft -= 2;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (nleft == 1) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; last.uc[0] = *(u_char *)w;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; last.uc[1] = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sum += last.us;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; sum = (sum &amp;gt;&amp;gt; 16) + (sum &amp;amp; 0xffff);
&amp;nbsp;&amp;nbsp;&amp;nbsp; sum += (sum &amp;gt;&amp;gt; 16);
&amp;nbsp;&amp;nbsp;&amp;nbsp; answer = ~sum;
&amp;nbsp;&amp;nbsp;&amp;nbsp; return(answer);
}

int
main(int argc, char **argv)
{
&amp;nbsp;&amp;nbsp;&amp;nbsp; struct ip ip;
&amp;nbsp;&amp;nbsp;&amp;nbsp; struct udphdr udp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; struct icmp icmp;
&amp;nbsp;&amp;nbsp;&amp;nbsp; int sd;
&amp;nbsp;&amp;nbsp;&amp;nbsp; const int on = 1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; struct sockaddr_in sin;
&amp;nbsp;&amp;nbsp;&amp;nbsp; u_char *packet;
/* Выделяем память для нашего пакета */
&amp;nbsp;&amp;nbsp;&amp;nbsp; packet = (u_char *)malloc(60);
/* Длина заголовков(включая опции): 32 бита(4 байта) каждый. 
Учитывая что мы не будем посылать никаких опций, длина IP 
пакета будет равна 20 байт, поэтому нам нужно (20 / 4 = 5) */
&amp;nbsp;&amp;nbsp;&amp;nbsp; ip.ip_hl = 0x5;
/* Версия протокола 4(IPv4) */
&amp;nbsp;&amp;nbsp;&amp;nbsp; ip.ip_v = 0x4;
/* Приоритет пакета */
&amp;nbsp;&amp;nbsp;&amp;nbsp; ip.ip_tos = 0x0;
/* Общая длина пакета. */
&amp;nbsp;&amp;nbsp;&amp;nbsp; ip.ip_len = 60; /* В linux htons(60) */
/* Уникальный идентефикатор пакета, посланного хостом */
&amp;nbsp;&amp;nbsp;&amp;nbsp; ip.ip_id = htons(12830);
/* Смещение пакета. Ставим 0x0, т.к. в данном случае 
не предусмотрено фрагментации */
&amp;nbsp;&amp;nbsp;&amp;nbsp; ip.ip_off = 0x0;
/* Время жизни, при проходе через маршрутизатор уменьшается 
на единицу, если равно нулю то отбрасывается маршрутизатором */
&amp;nbsp;&amp;nbsp;&amp;nbsp; ip.ip_ttl = 64;
/* Используемый протокол */
&amp;nbsp;&amp;nbsp;&amp;nbsp; ip.ip_p = IPPROTO_ICMP;
/* Устанавливаем в 0 до того как считать контрольную сумму. 
Здесь контрольная сумма считается только для IP пакета, 
протоколы верхнего уровня имеют собственные поля для контрольной 
суммы, которая должна быть посчитана отдельно */
&amp;nbsp;&amp;nbsp;&amp;nbsp; ip.ip_sum = 0x0;
/* Адрес отправителя. Если вписать в следующие 2 поля свой адрес,
 то пакет пойдёт через интерфейс lo0 */
&amp;nbsp;&amp;nbsp;&amp;nbsp; ip.ip_src.s_addr = inet_addr("172.12.129.30");
/* Адрес получателя */
&amp;nbsp;&amp;nbsp;&amp;nbsp; ip.ip_dst.s_addr = inet_addr("172.12.129.30");
/* Считаем контрольную сумму IP пакета. Некоторые драйверы 
поддерживают автоматическую разгрузку контрольной суммы, чтобы поля 
контрольной суммы не заполнялись нулями, её нужно отключить
(ifconfig &amp;lt;имя интерфейса&amp;gt; -rxcsum -txcsum) */
&amp;nbsp;&amp;nbsp;&amp;nbsp; ip.ip_sum = in_cksum((unsigned short *)&amp;amp;ip, sizeof(ip));
/* Тело IP пакета готово, копируем его в начало нашего пакета */
&amp;nbsp;&amp;nbsp;&amp;nbsp; memcpy(packet, &amp;amp;ip, sizeof(ip));
/* ICMP пакет. Тип */
&amp;nbsp;&amp;nbsp;&amp;nbsp; icmp.icmp_type = ICMP_ECHO;
/* Код 0 - request */
&amp;nbsp;&amp;nbsp;&amp;nbsp; icmp.icmp_code = 0;
/* ID - Любое число */
&amp;nbsp;&amp;nbsp;&amp;nbsp; icmp.icmp_id = htons(1000);/*В Linux htons не требуется*/
/* Последовательный номер */
&amp;nbsp;&amp;nbsp;&amp;nbsp; icmp.icmp_seq = 0;
/* Считаем контрольную сумму */
&amp;nbsp;&amp;nbsp;&amp;nbsp; icmp.icmp_cksum = 0;
&amp;nbsp;&amp;nbsp;&amp;nbsp; icmp.icmp_cksum = in_cksum((unsigned short *)&amp;amp;icmp, 8);
/* Копируем ICMP в наш пакет сразу после IP */
&amp;nbsp;&amp;nbsp;&amp;nbsp; memcpy(packet + 20, &amp;amp;icmp, 8);
/* Пакет готов, теперь нужно подготовить сокет */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) &amp;lt; 0) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; perror("socket error");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
/* Сообщаем, что заголовок уже вложен */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (setsockopt(sd, IPPROTO_IP, IP_HDRINCL, &amp;amp;on, sizeof(on)) &amp;lt; 0) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; perror("setsockopt error");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; memset(&amp;amp;sin, 0, sizeof(sin));
&amp;nbsp;&amp;nbsp;&amp;nbsp; sin.sin_family = AF_INET;
&amp;nbsp;&amp;nbsp;&amp;nbsp; sin.sin_addr.s_addr = ip.ip_dst.s_addr;
/* Вместо send используем sendto, т.к. соединение не было установлено */
&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sendto(sd, packet, 60, 0, (struct sockaddr *)&amp;amp;sin, sizeof(struct sockaddr)) &amp;lt; 0)&amp;nbsp; {
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; perror("sendto error");
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1);
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;
}
&lt;/pre&gt;Должно получиться примерно следующее: &lt;br /&gt;
Первый терминал:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;# gcc ICMP.c -o ICMP&lt;br /&gt;
ICMP.c:122:2: warning: no newline at end of file&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;# ~/ICMP&lt;/blockquote&gt;На втором терминале tcpdump ругается что контрольная сумма не правильная(см. ниже)&lt;br /&gt;
Отключаем разгрузку и запускаем ещё раз&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;# ifconfig lo0 -rxcsum -txcsum&lt;br /&gt;
# ~/ICMP&lt;/blockquote&gt;Не ругается&lt;br /&gt;
Снова включаем&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;# ifconfig lo0 rxcsum txcsum&lt;br /&gt;
# ~/ICMP&lt;/blockquote&gt;Второй терминал:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;#tcpdump -i lo0 -vvv 'icmp'&lt;br /&gt;
tcpdump: listening on lo0, link-type NULL (BSD loopback), capture size 96 bytes&lt;br /&gt;
21:21:00.057656 IP (tos 0x0, ttl 64, id 12830, offset 0, flags [none], proto ICMP (1), length 60, bad cksum 0 (-&amp;gt;9e25)!)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;IP&amp;gt; &amp;gt; &amp;lt;IP&amp;gt;: ICMP echo request, id 1000, seq 0, length 40&lt;br /&gt;
21:21:00.057667 IP (tos 0x0, ttl 64, id 50209, offset 0, flags [none], proto ICMP (1), length 60, bad cksum 0 (-&amp;gt;c22)!)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;IP&amp;gt; &amp;gt; &amp;lt;IP&amp;gt;: ICMP echo reply, id 1000, seq 0, length 40&lt;br /&gt;
21:21:19.243796 IP (tos 0x0, ttl 64, id 12830, offset 0, flags [none], proto ICMP (1), length 60)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;IP&amp;gt; &amp;gt; &amp;lt;IP&amp;gt;: ICMP echo request, id 1000, seq 0, length 40&lt;br /&gt;
21:21:19.243807 IP (tos 0x0, ttl 64, id 50260, offset 0, flags [none], proto ICMP (1), length 60)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;IP&amp;gt; &amp;gt; &amp;lt;IP&amp;gt;: ICMP echo reply, id 1000, seq 0, length 40&lt;br /&gt;
21:21:35.837038 IP (tos 0x0, ttl 64, id 12830, offset 0, flags [none], proto ICMP (1), length 60, bad cksum 0 (-&amp;gt;9e25)!)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;IP&amp;gt; &amp;gt; &amp;lt;IP&amp;gt;: ICMP echo request, id 1000, seq 0, length 40&lt;br /&gt;
21:21:35.837049 IP (tos 0x0, ttl 64, id 50265, offset 0, flags [none], proto ICMP (1), length 60, bad cksum 0 (-&amp;gt;bea)!)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;IP&amp;gt; &amp;gt; &amp;lt;IP&amp;gt;: ICMP echo reply, id 1000, seq 0, length 40&lt;/blockquote&gt;&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2011/11/raw-1-icmp.html</link><author>noreply@blogger.com (Александр)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-810837500102926940.post-6494674551423621639</guid><pubDate>Wed, 16 Nov 2011 18:25:00 +0000</pubDate><atom:updated>2011-11-20T00:21:20.117+07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Кодинг</category><title>Перехват системных вызовов</title><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Система: FreeBSD 8.2-RELEASE&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;pre class="brush:cpp"&gt;/* Файл test.c */

#include &amp;lt;unistd.h&amp;gt;

int
main(void)
{
  write(1, "test1\n", 6);
  return 0;
}
&lt;/pre&gt;&lt;br /&gt;
&lt;pre class="brush:cpp"&gt;/* Файл newlib.c */

/* Фактически write это еще одна библиотечная функция, которая 
надстроена над настоящим системным вызовом _write, "старая" 
функция будет по-прежнему доступна через вызов _write
(в linux используется glibc, а вызов имеет имя __write) */
extern int _write(int fd, const char *buff, long len);

int
write(int fd, const char *buff, long len)
{
  _write(fd, "test2\n", 6);
  _write(fd, buff, len);
}
&lt;/pre&gt;&lt;br /&gt;
Собираем нашу библиотеку&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;$ gcc newlib.c -fPIC -c&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;newlib.c:10:2: warning: no newline at end of file&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;$ gcc newlib.o -shared -o newlib.so&lt;/blockquote&gt;Собираем исполняемый файл&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;$ gcc test.c&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;test.c:9:2: warning: no newline at end of file&lt;/blockquote&gt;Запуск файла без подмены функции&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;$ ./a.out&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;test1 &lt;/blockquote&gt;Запуск файла с подменой функции&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;$ export LD_PRELOAD=`pwd`/newlib.so&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;$ ./a.out&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;test2&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;test1&lt;/blockquote&gt;Очищаем переменную&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;$ unset LD_PRELOAD&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;$ ./a.out&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;test1&lt;/blockquote&gt;&lt;br /&gt;
За подробностями: man ld.so&lt;br /&gt;
&lt;blockquote&gt;&lt;/blockquote&gt;&lt;/div&gt;</description><link>http://nix-blog-1.blogspot.com/2011/11/blog-post.html</link><author>noreply@blogger.com (Александр)</author><thr:total>0</thr:total></item></channel></rss>