From sitkarev на komitex.ru Mon Dec 6 00:33:17 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 05 Dec 2010 23:33:17 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/RgNC40LzQtdGAINC00LvRjyDRgNCw0LfQsdC+0YA=?= =?utf-8?b?0LAg0LjRgdGF0L7QtNC90L7Qs9C+INC60L7QtNCwIC0gY2F0KDEpINC40Lcg?= =?utf-8?q?BSD_4=2E2?= Message-ID: <4CFBF70D.8000209@komitex.ru> Приветствую всех. Я взял исходный текст утилиты cat(1) из Berkeley Software Distribution 4.2 (BSD 4.2) и слегка осовременил его, с учётом некоторых изменений в языке Си с тех времён (весьма незначительных). В программе нет зависимостей от других файлов и функций, кроме как определённых в нём самом и в стандартной библиотеке Си -- libc. Сама программа конечно не шедевр, но для практического разбора подойдёт. Для того чтобы лучше понять что она делает, я вложил также man-страницу в формате nroff, посмотреть её можно очень просто: $ troff -man -Tascii cat.1 Сама утилита компилируется компилятором gcc как обычно вы это делали с программой из одного файла. Все вопросы присылайте в рассылку, будем рассматривать их под увеличительным стеклом. -- Г.А. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: cat.c Type: text/x-csrc Size: 3980 bytes Desc: отсутствует URL: ----------- следущая часть ----------- An embedded and charset-unspecified text was scrubbed... Name: cat.1 URL: From lonely.ruyk на mail.ru Mon Dec 6 22:37:12 2010 From: lonely.ruyk на mail.ru (=?koi8-r?Q?=E2=CF=D2=C9=D3_=EC=C9=D0=C9=CE?=) Date: Mon, 06 Dec 2010 21:37:12 +0300 Subject: [P&AM Lab] Echo.c Message-ID: Григорий Александрович, здравствуйте. Возникла пара вопросов в процессе разбора сорсов echo. Основной алгоритм вроде бы понятен, но пара строчек всё же вызывает вопросы. Совсем не понятно что значит строка: #if !ENABLE_FEATURE_FANCY_ECHO и зачем вообще нужно было вводить ветвления #if.... #else...#endif. ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From sitkarev на komitex.ru Mon Dec 6 23:22:26 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 06 Dec 2010 22:22:26 +0300 Subject: [P&AM Lab] Echo.c In-Reply-To: References: Message-ID: <4CFD37F2.40201@komitex.ru> Отлично, отлично. Это директивы препроцессора. Они дают возможность делать условную компиляцию. Если при компиляции был определён символ препроцессора ENABLE_FEATURE_FANCY_ECHO, то из исходного файла будут включены участки кода так: #if !ENABLE_FEATURE_FANCY_ECHO код здесь будет пропущен #else код отсюда пойдёт на компиляцию #endif У busybox есть своя система конфигурирования сборки, т.к. вариантов того что нужно на конкретную платформу может быть много. Она запускается из корневого каталога так: $ pwd /home/sitkarev/Downloads/busybox/busybox-1.10.2 $ make menuconfig Если там дальше зайти в меню в Coreutils и потом спуститься вниз где конфигурируется сборка echo, там будет опция 'Enable echo options (-n and -e)'. Если посмотреть по ней Help, то там видно что эта опция включает символ FEATURE_FANCY_ECHO, а в сборке echo тогда будут обрабатываться опции -n и -e. В спецификации SuSv3 у echo нет опций вообще, но в некоторых реализациях они есть, например в родной echo на Linux. Они соответственно выключают вывод newline и включают интерпретацию escape-последовательностей '\' как специальных символов (например \t или \b) включая 8-ные коды (\0777). При запуске gcc потом ему будет передана опция: $ gcc -Wall -DENABLE_FEATURE_FANCY_ECHO ... Примерно так, а это значит что для препроцессора будет установлен символ ENABLE_FEATURE_FANCY_ECHO и соответствующий код будет компилирован. Там можно символу препроцессора установить и значение какое-то, но здесь это не нужно. Это равносильно тому что вы в начале исходного файла сделали так: #define ENABLE_FEATURE_FANCY_ECHO Старайтесь внимательнее смотреть сами исходные тексты и особенно комментарии. Там в самом начале содержится такая информация: /* Mar 16, 2003 Manuel Novoa III (mjn3 на codepoet.org) * * Because of behavioral differences, implemented configurable SUSv3 * or 'fancy' gnu-ish behaviors. Also, reduced size and fixed bugs. * 1) In handling '\c' escape, the previous version only suppressed the * trailing newline. SUSv3 specifies _no_ output after '\c'. * 2) SUSv3 specifies that octal escapes are of the form \0{#{#{#}}}. * The previous version did not allow 4-digit octals. */ -- Г.А. Борис Липин пишет: > Григорий Александрович, здравствуйте. > Возникла пара вопросов в процессе разбора сорсов echo. Основной алгоритм вроде бы понятен, но пара строчек всё же вызывает вопросы. > Совсем не понятно что значит строка: #if !ENABLE_FEATURE_FANCY_ECHO > и зачем вообще нужно было вводить ветвления #if.... #else...#endif. From sitkarev на komitex.ru Mon Dec 6 23:55:01 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 06 Dec 2010 22:55:01 +0300 Subject: [P&AM Lab] Echo.c In-Reply-To: References: Message-ID: <4CFD3F95.10907@komitex.ru> Для примера, файл test.c, компилируйте с -DPRINT_MESSAGE и без, и посмотрите что будет. Попробуйте также задать символ для препроцессора через define в самом начале файла (после заголовков): #define PRINT_MESSAGE $ gcc -Wall -o test test.c и $ gcc -Wall -DPRINT_MESSAGE -o test test.c Для препроцессора директивы if и ifndef соответственно проверка на то установлен ли такой символ или нет (if not defined). Там можно использовать и логическое НЕ, также как и в языке Си. #if !PRINT_MESSAGE Думаю теперь понятно зачем это нужно. Хотя вообще считается что использовать условную компиляцию нужно очень аккуратно, она затрудняет читаемость программы. Кроме того, получается что в одной программе их фактически две (или больше). -- Г.А. Борис Липин пишет: > Григорий Александрович, здравствуйте. > Возникла пара вопросов в процессе разбора сорсов echo. Основной алгоритм вроде бы понятен, но пара строчек всё же вызывает вопросы. > Совсем не понятно что значит строка: #if !ENABLE_FEATURE_FANCY_ECHO > и зачем вообще нужно было вводить ветвления #if.... #else...#endif. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: test.c Type: text/x-csrc Size: 165 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Tue Dec 7 22:27:28 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Tue, 07 Dec 2010 21:27:28 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/RgNC40LzQtdGAINC00LvRjyDRgNCw0LfQsdC+0YA=?= =?utf-8?b?0LAg0LjRgdGF0L7QtNC90L7Qs9C+INC60L7QtNCwIC0gY2F0KDEpINC40Lcg?= =?utf-8?q?BSD_4=2E2?= In-Reply-To: <4CFBF70D.8000209@komitex.ru> References: <4CFBF70D.8000209@komitex.ru> Message-ID: <4CFE7C90.1040101@komitex.ru> Кто нибудь вообще взялся за разбор исходного текста? -- Г.А. Grigoriy A. Sitkarev пишет: > Приветствую всех. > > Я взял исходный текст утилиты cat(1) из Berkeley Software Distribution > 4.2 (BSD 4.2) и слегка осовременил его, с учётом некоторых изменений в > языке Си с тех времён (весьма незначительных). From ilyaart90 на rambler.ru Wed Dec 8 19:53:10 2010 From: ilyaart90 на rambler.ru (=?windows-1251?B?yOv8/yDA8PLl5eI=?=) Date: Wed, 08 Dec 2010 18:53:10 +0300 Subject: [P&AM Lab] =?windows-1251?b?z/Do7OXwIOTr/yDw4Ofh7vDgIOjx9e7k7e7j?= =?windows-1251?b?7iDq7uTgIC0gY2F0KDEpIOjnIEJTRCA0LjI=?= References: <4CFBF70D.8000209@komitex.ru> Message-ID: <208575770.1291823590.169039188.22468@mcgi38.rambler.ru> Вопрос на счет man-страницы Как воспользоваться? Вставить весь текст в новый файл в формате nroff и открыть с помощью $ troff -man -Tascii cat.c ? если да то выводится, но просто таким же текстом From karginrusja на mail.ru Wed Dec 8 20:08:58 2010 From: karginrusja на mail.ru (Kargin Ruslan) Date: Wed, 08 Dec 2010 19:08:58 +0300 Subject: [P&AM Lab] =?koi8-r?b?8NLJzcXSIMTM0SDSwdrCz9LBIMnTyM/Ezs/HzyDL?= =?koi8-r?b?z8TBIC0gY2F0KDEpIMnaIEJTRCA0LjI=?= In-Reply-To: <208575770.1291823590.169039188.22468@mcgi38.rambler.ru> References: <4CFBF70D.8000209@komitex.ru> <208575770.1291823590.169039188.22468@mcgi38.rambler.ru> Message-ID: <1291824538.2717.2.camel@luci> $ groff -man -Tascii cat.1 В Срд, 08/12/2010 в 18:53 +0300, Илья Артеев пишет: > Вопрос на счет man-страницы > Как воспользоваться? > Вставить весь текст в новый файл в формате nroff и открыть с помощью $ > troff -man -Tascii cat.c ? > если да то выводится, но просто таким же текстом From ilyaart90 на rambler.ru Wed Dec 8 18:56:37 2010 From: ilyaart90 на rambler.ru (=?windows-1251?B?yOv8/yDA8PLl5eI=?=) Date: Wed, 08 Dec 2010 17:56:37 +0300 Subject: [P&AM Lab] =?windows-1251?b?z/Do7OXwIOTr/yDw4Ofh7vDgIOjx9e7k7e7j?= =?windows-1251?b?7iDq7uTgIC0gY2F0KDEpIOjnIEJTRCA0LjI=?= References: <4CFBF70D.8000209@komitex.ru> <4CFE7C90.1040101@komitex.ru> Message-ID: <483540382.1291820197.127142040.34199@mcgi-wr-6.rambler.ru> Я только сейчас нашел время и добрался до него. А Боря с Игорем сегодня с утра уже чего-то ковыряли. > Кто нибудь вообще взялся за разбор исходного текста? > > -- > Г.А. > > Grigoriy A. Sitkarev пишет: > > Приветствую всех. > > > > Я взял исходный текст утилиты cat(1) из Berkeley Software Distribution > > 4.2 (BSD 4.2) и слегка осовременил его, с учётом некоторых изменений в > > языке Си с тех времён (весьма незначительных). > > _______________________________________________ > Lab mailing list > Lab на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/lab From sitkarev на komitex.ru Wed Dec 8 22:56:10 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 08 Dec 2010 21:56:10 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/RgNC40LzQtdGAINC00LvRjyDRgNCw0LfQsdC+0YA=?= =?utf-8?b?0LAg0LjRgdGF0L7QtNC90L7Qs9C+INC60L7QtNCwIC0gY2F0KDEpINC40Lcg?= =?utf-8?q?BSD_4=2E2?= In-Reply-To: <483540382.1291820197.127142040.34199@mcgi-wr-6.rambler.ru> References: <4CFBF70D.8000209@komitex.ru> <4CFE7C90.1040101@komitex.ru> <483540382.1291820197.127142040.34199@mcgi-wr-6.rambler.ru> Message-ID: <4CFFD4CA.1090408@komitex.ru> Да, вы не стесняйтесь вопросы задавать, если что. Там некоторые места могут быть не очень понятны, и это нормально. На troff/groff рука дрогнула - groff это обвёртка вокруг troff, её и надо пользовать. Для интересующихся, troff это возможно самая первая система типографского набора для компьтеров (TeX вышел позже). Там было несколько программ ещё, в частности tbl(1), eq(1) и pic(1) для набора таблиц, формул и иллюстраций. Они практически с самых ранних редакций Unix были в дистрибутиве - система использовалась для документирования в самой AT&T. Кому интересно, почитают здесь: http://www.troff.org/prog.html Все ваши любимые книги были набраны в troff: http://www.troff.org/pubs.html -- Г.А. Илья Артеев пишет: > Я только сейчас нашел время и добрался до него. > > А Боря с Игорем сегодня с утра уже чего-то ковыряли. > From lonely.ruyk на mail.ru Thu Dec 9 21:36:26 2010 From: lonely.ruyk на mail.ru (=?koi8-r?Q?=E2=CF=D2=C9=D3_=EC=C9=D0=C9=CE?=) Date: Thu, 09 Dec 2010 20:36:26 +0300 Subject: [P&AM Lab] =?koi8-r?b?8NLJzcXSIMTM0SDSwdrCz9LBIMnTyM/Ezs/HzyDL?= =?koi8-r?b?z8TBIC0gY2F0KDEpIMnaIEJTRCA0LjI=?= Message-ID: Тут парочка вопросов возникла по поводу cat 1) switch(argv[1][1]) { case 0: break; case 'u': setbuf(stdout, (char *)NULL); uflg++; continue; case 'n': nflg++; continue; ...} Почему здесь мы для флагов используем ++ а не просто приравниваем флагк 1( uflg=1); Связанно ли это както с тем что операция инкремента вассемблере занимает меньше памяти чем mov? 2) Что содержится в поле st_ino структуры struct stat statb,всмысле какойу неё логический смысл, и зачем мы её вводили в программу? 3) stdout-ссылка на стандартный файл вывода.А на что именно он ссылается? Заранее спасибо:) ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From rg-400 на list.ru Thu Dec 9 22:33:15 2010 From: rg-400 на list.ru (jam) Date: Thu, 09 Dec 2010 21:33:15 +0300 Subject: [P&AM Lab] =?koi8-r?b?8NLJzcXSIMTM0SDSwdrCz9LBIMnTyM/Ezs/HzyDL?= =?koi8-r?b?z8TBIC0gY2F0KDEpIMnaIEJTRCA0LjI=?= In-Reply-To: References: Message-ID: <1291919595.1624.8.camel@jam> Время выполнения разбора опций очень маленькое, так что вряд ли это оптимизация, скорее удобная запись. (можно было и побитовыми операциями unsigned int flags, FLAG1, FLAG2; flags = 0; FLAG1 = 1 << 0;//000...1 FLAG2 = 1 << 1;//00...10 flags |= FLAG1;//включение опции flags |= FLAG2; flags &= ~FLAG2; //выключение опции if (flags & FLAG1) { .. } if (flags & FLAG2) { ... } ) В Чтв, 09/12/2010 в 20:36 +0300, Борис Липин пишет: > Тут парочка вопросов возникла по поводу cat > 1) > switch(argv[1][1]) { > case 0: > break; > case 'u': > setbuf(stdout, (char *)NULL); > uflg++; > continue; > case 'n': > nflg++; > continue; > ...} > Почему здесь мы для флагов используем ++ а не просто приравниваем флаг > к 1( uflg=1); Связанно ли это както с тем что операция инкремента в > ассемблере занимает меньше памяти чем mov? > 2) > Что содержится в поле st_ino структуры struct stat statb,всмысле какой > у неё логический смысл, и зачем мы её вводили в программу? > 3) > stdout-ссылка на стандартный файл вывода.А на что именно он ссылается? > > Заранее спасибо:) > _______________________________________________ > Lab mailing list > Lab на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/lab From sitkarev на komitex.ru Thu Dec 9 22:44:07 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 09 Dec 2010 21:44:07 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/RgNC40LzQtdGAINC00LvRjyDRgNCw0LfQsdC+0YA=?= =?utf-8?b?0LAg0LjRgdGF0L7QtNC90L7Qs9C+INC60L7QtNCwIC0gY2F0KDEpINC40Lcg?= =?utf-8?q?BSD_4=2E2?= In-Reply-To: References: Message-ID: <4D012377.6020209@komitex.ru> Сейчас по порядку. Борис Липин пишет: > Тут парочка вопросов возникла по поводу cat > 1) > switch(argv[1][1]) { > case 0: > break; > case 'u': > setbuf(stdout, (char *)NULL); > uflg++; > continue; > case 'n': > nflg++; > continue; > ...} > Почему здесь мы для флагов используем ++ а не просто приравниваем флагк 1( uflg=1); Связанно ли это както с тем что операция инкремента вассемблере занимает меньше памяти чем mov? Меньше, да и традиция такая скорее. Дело в том что пользователь может несколько раз указать ту же опцию -u. Здесь ведётся подсчёт, сколько раз он её указал, получается так. Никто не запрещает там сделать uflg = 1 и алгоритмически это будет верно, но традиция есть традиция. > 2) > Что содержится в поле st_ino структуры struct stat statb,всмысле какойу неё логический смысл, и зачем мы её вводили в программу? Это очень важная структура, в ней хранится метаинформация о файле. Системный вызов stat(2) её туда помещает. В программе она используется для того чтобы: 1) проверить что файл не является файлом устройства (блочного или символьного). Проверяются биты S_IFBLK и S_IFCHR в поле .st_mode. 2) узнать размер блока т.е. дискретной единицы с которой ведутся операции чтения и записи. Это поле .st_blksize. 3) проверяется что файл, который выводят, и файл в который выводят являются разными файлами. В Unix файл уникально идентифицируется двумя целыми числами - номером устройства и номером индексного дескриптора. Эти поля также содержатся в структуре stat (.st_dev, st_ino). Вы помните что в Unix есть файлы-ссылки, т.е. разные имена могут ссылаться на одни и те же данные файла. Чтобы cat(1) не напортачил, таким образом проверяется что файлы "что выводить" и "куда выводить" - разные. Рекомендую прочесть man-страницу stat(2). > 3) > stdout-ссылка на стандартный файл вывода.А на что именно он ссылается? Есть соглашение в Unix программах (и те которые на Си в системах общего применения) при запуске открыты три файла с номерами дескрипторов файлов (определены в unistd.h): STDIN_FILENO - 0 STDOUT_FILENO - 1 STDERR_FILENO - 2 Можно пользоваться как макросами, так и прямо числовыми константами. Если мы пишем "параноидальную" программу, то неплохо бы проверить что эти дескрипторы действительно есть, иначе перенаправлять их в /dev/null. Считается что у любой Си программы эти файлы открыты и должны быть соединены с соответствующими файлами (для интерактивных программ это как правило текущее устройство терминала пользователя). В Linux например можно у программы посмотреть с какими файлами эти дескрипторы ассоциированы, пролистав длинным листингом (ls -la) каталог /proc//fd. Получается что открывать самому эти файлы не нужно, как обычно надо делать с другими файлами, через системный вызов open(2), потому что они должны быть открыты уже. Это дескрипторы "сырого" (небуферизованного) ввода/вывода, т.е. которые мы пользуем с вызовами read(2), write(2) и т.д. Вы прямо с shell можете перенаправлять у программы эти дескрипторы, если помните, мы это делали на занятиях, я показывал там что-то вроде: $ cat /etc/passwd > /root/saved_passwd Есть три потока буферизованного ввода/вывода, это то что вы можете использовать с fread(3), fwrite(3), fprintf(3) и т.д.: stdin stdout stderr Они объявлены где-то в заголовках как: extern FILE *stdin, *stdout, *stderr; И в каждой Си программе они есть в адресном пространстве. Они также соединены со стандартным вводом, выводом и выводом ошибок. Поэтому я могу печатать сообщения об ошибках так: fprintf(stderr, "error: %s:%d:%s(): something is wrong!\n", __FILE__, __LINE__, __FUNCTION__); __FILE__, __LINE__, и __FUNCTION__ - это макросы, которые препроцессор раскрывает в имена файла, номера строки и имя функции. Вызов printf("Message"); эквивалентен: fprintf(stdout, "Message"); Успехов. -- Г.А. From sitkarev на komitex.ru Thu Dec 9 22:52:45 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 09 Dec 2010 21:52:45 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/RgNC40LzQtdGAINC00LvRjyDRgNCw0LfQsdC+0YA=?= =?utf-8?b?0LAg0LjRgdGF0L7QtNC90L7Qs9C+INC60L7QtNCwIC0gY2F0KDEpINC40Lcg?= =?utf-8?q?BSD_4=2E2?= In-Reply-To: <1291919595.1624.8.camel@jam> References: <1291919595.1624.8.camel@jam> Message-ID: <4D01257D.8070406@komitex.ru> Егор, ты наверное хотел сказать так: #define FLAG1 0x0001 #define FLAG2 0x0002 Всё же есть традиция что имена начинающиеся с большой буквы это макросы. Хотя, опять же, алгоритмически ты прав. Часто в современной литературе рекомендуют использовать для битовых полей перечисления, вот там больше похоже на то как у тебя: enum { FLAG1 = 1 << 0, FLAG2 = 1 << 1 }; Что выбрать на самом деле конечно дело вкуса. -- Г.А. jam пишет: > Время выполнения разбора опций очень маленькое, так что вряд ли это > оптимизация, скорее удобная запись. > (можно было и побитовыми операциями > > unsigned int flags, FLAG1, FLAG2; > flags = 0; > FLAG1 = 1 << 0;//000...1 > FLAG2 = 1 << 1;//00...10 > > flags |= FLAG1;//включение опции > flags |= FLAG2; > flags &= ~FLAG2; //выключение опции > > if (flags & FLAG1) { > .. > } > if (flags & FLAG2) { > ... > } > ) > From karginrusja на mail.ru Thu Dec 9 23:10:30 2010 From: karginrusja на mail.ru (Kargin Ruslan) Date: Thu, 09 Dec 2010 22:10:30 +0300 Subject: [P&AM Lab] =?koi8-r?b?8NLJzcXSIMTM0SDSwdrCz9LBIMnTyM/Ezs/HzyDL?= =?koi8-r?b?z8TBIC0gY2F0KDEpIMnaIEJTRCA0LjI=?= In-Reply-To: <4D01257D.8070406@komitex.ru> References: <1291919595.1624.8.camel@jam> <4D01257D.8070406@komitex.ru> Message-ID: <1291921830.2467.3.camel@luci> В Чтв, 09/12/2010 в 21:52 +0300, Grigoriy A. Sitkarev пишет: > ... > Что выбрать на самом деле конечно дело вкуса. > > -- > Г.А. На самом деле рекомендуется избегать применения макросов за исключением ситуаций, где без них не обойтись. В данном конкретном случае рекомендуется использовать перечислимые константы enum - они "светятся" в отладчиками именами. From sitkarev на komitex.ru Thu Dec 9 23:35:50 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 09 Dec 2010 22:35:50 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/RgNC40LzQtdGAINC00LvRjyDRgNCw0LfQsdC+0YA=?= =?utf-8?b?0LAg0LjRgdGF0L7QtNC90L7Qs9C+INC60L7QtNCwIC0gY2F0KDEpINC40Lcg?= =?utf-8?q?BSD_4=2E2?= In-Reply-To: <1291921830.2467.3.camel@luci> References: <1291919595.1624.8.camel@jam> <4D01257D.8070406@komitex.ru> <1291921830.2467.3.camel@luci> Message-ID: <4D012F96.5000009@komitex.ru> Прокомментирую. > На самом деле рекомендуется избегать применения макросов за исключением > ситуаций, где без них не обойтись. В данном конкретном случае > рекомендуется использовать перечислимые константы enum - они "светятся" > в отладчиками именами. Биты светится не будут. Если нам нужно определить битовые поля, то это дело вкуса, как сделать. В Unix традиции определялись константные значения битов через #define, существует также другая традиция, делать их в enum и например, ещё и тип определять новый: typedef enum { FLAGS_ENABLE_OPTION = 1 << 0, FLAGS_ENABLE_ANOTHER = 1 << 1, FLAGS_DO_SOMETHING = 1 << 2 } flags_t; И тогда в функциях, которым передаётся аргумент в виде этих битовых флагов, используется этот тип: int do_something(flags_t flags); и затем мы делаем так: do_something(FLAGS_ENABLE_OPTION | FLAGS_ENABLE_ANOTHER); Это значит что туда можно передавать комбинацию из логического ИЛИ из этих флагов (об этом отдельно упоминается в документации к функции). Тип определяли мы только для ясности. Это опять же чисто типографский метод для того чтобы код проще было читать, особенно если флагов много. Перечислимый тип в Си вовсе не означает что он может принимать только значения из перечисления, можно сунуть любое. Он введён для удобства чтения программы и конечно же, как заметили, в отладчике будет видно символьное представление, если там соответствующее есть, если нет, то не будет. Вообще в хорошем API флагов будет мало или совсем не будет. С этой точки зрения Unix API часто критикуют, но в целом, они все довольно быстро запоминаются и проблем с ними нет. Светиться в отладчике будет если действительно используется перечислимый тип, т.е. значения ТОЛЬКО из enum. В нашем случае это не перечисления а битовые поля из которых можно составлять комбинации через логическое ИЛИ. Поэтому в нашем случае как делать, через #define или же enum - дело вкуса, ещё раз повторюсь. -- Г.А. From karginrusja на mail.ru Fri Dec 10 00:34:15 2010 From: karginrusja на mail.ru (Kargin Ruslan) Date: Thu, 09 Dec 2010 23:34:15 +0300 Subject: [P&AM Lab] =?koi8-r?b?8NLJzcXSIMTM0SDSwdrCz9LBIMnTyM/Ezs/HzyDL?= =?koi8-r?b?z8TBIC0gY2F0KDEpIMnaIEJTRCA0LjI=?= In-Reply-To: <4D012F96.5000009@komitex.ru> References: <1291919595.1624.8.camel@jam> <4D01257D.8070406@komitex.ru> <1291921830.2467.3.camel@luci> <4D012F96.5000009@komitex.ru> Message-ID: <1291926855.2467.21.camel@luci> В Чтв, 09/12/2010 в 22:35 +0300, Grigoriy A. Sitkarev пишет: > Поэтому в нашем случае как делать, через #define или же enum - дело > вкуса, ещё раз повторюсь. > > -- > Г.А. > Как тонко, но всё же есть рекомендации (хотя их можно и не соблюдать). Они имеются именно потому, что код с enum проще читать и разбирать в отладчике: комбинация битовых полей действительно не будет светится именем, но для разбора кода в отладчике наиболее интересны моменты, когда проверяется установка того или иного бита, а её результат будет светится именем. Далее, флаги, вообще говоря, можно считать связанными константами, и тогда для них действует рекомендация "Enums are preferred when defining several related constants" (linux kernel coding style). Использование же макросов считается устаревшим стилем из-за проблем, которые они обычно с собой несут, хотя в данном случае их нет. Подробнее можно почитать в 1.4 и 1.5 книги Б.Керниган, Р. Пайк. "Практика программирования". P.S. Надо бы тут заканчивать, а то положим список =) From sitkarev на komitex.ru Fri Dec 10 01:00:20 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Fri, 10 Dec 2010 00:00:20 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/RgNC40LzQtdGAINC00LvRjyDRgNCw0LfQsdC+0YA=?= =?utf-8?b?0LAg0LjRgdGF0L7QtNC90L7Qs9C+INC60L7QtNCwIC0gY2F0KDEpINC40Lcg?= =?utf-8?q?BSD_4=2E2?= In-Reply-To: <1291926855.2467.21.camel@luci> References: <1291919595.1624.8.camel@jam> <4D01257D.8070406@komitex.ru> <1291921830.2467.3.camel@luci> <4D012F96.5000009@komitex.ru> <1291926855.2467.21.camel@luci> Message-ID: <4D014364.7050401@komitex.ru> Руслик, там речь идёт о функциях-макросах. Макросы-функции действительно очень опасная вещь, из-за побочных эффектов которые там возникают в силу того что аргументы у них не вычисляются как выражения, а буквально подставляются при расширении макроса в код. Когда же возражали что дескать, макросы быстрее чем функции, у функции надо формировать кадр вызова и т.д., то здесь был ответ такой что в таком случае лучше используйте inline функции. Сами макросы не устарели, просто с ними надо осторожно. Осторожно. -- Г.А. Kargin Ruslan пишет: > Использование же макросов считается устаревшим стилем из-за проблем, > которые они обычно с собой несут, хотя в данном случае их нет. Подробнее > можно почитать в 1.4 и 1.5 книги Б.Керниган, Р. Пайк. "Практика > программирования". > > P.S. Надо бы тут заканчивать, а то положим список =) > > > _______________________________________________ > Lab mailing list > Lab на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/lab From karginrusja на mail.ru Fri Dec 10 01:12:51 2010 From: karginrusja на mail.ru (Kargin Ruslan) Date: Fri, 10 Dec 2010 00:12:51 +0300 Subject: [P&AM Lab] =?koi8-r?b?8NLJzcXSIMTM0SDSwdrCz9LBIMnTyM/Ezs/HzyDL?= =?koi8-r?b?z8TBIC0gY2F0KDEpIMnaIEJTRCA0LjI=?= In-Reply-To: <4D014364.7050401@komitex.ru> References: <1291919595.1624.8.camel@jam> <4D01257D.8070406@komitex.ru> <1291921830.2467.3.camel@luci> <4D012F96.5000009@komitex.ru> <1291926855.2467.21.camel@luci> <4D014364.7050401@komitex.ru> Message-ID: <1291929171.2467.29.camel@luci> В Птн, 10/12/2010 в 00:00 +0300, Grigoriy A. Sitkarev пишет: > Сами макросы не устарели, просто с ними надо осторожно. Осторожно. > > -- > Г.А. Ну там не только про функции-макросы, но и про макросы-константы. Так что, пожалуй, на сегодня использование макросов оставлено только для тех ситуаций, где без них буквально не обойтись (то, что нельзя сделать другими средствами языка). Ну а использование для флагов действительно почти равноценно варианту с enum, за исключением того, что флаги всё-таки связанные константы, и их всё же лучше в enum =) Очень полезная ссылка, которую запамятовал привести: http://www.kernel.org/doc/Documentation/CodingStyle From sitkarev на komitex.ru Fri Dec 10 01:23:10 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Fri, 10 Dec 2010 00:23:10 +0300 Subject: [P&AM Lab] =?utf-8?b?0J/RgNC40LzQtdGAINC00LvRjyDRgNCw0LfQsdC+0YA=?= =?utf-8?b?0LAg0LjRgdGF0L7QtNC90L7Qs9C+INC60L7QtNCwIC0gY2F0KDEpINC40Lcg?= =?utf-8?q?BSD_4=2E2?= In-Reply-To: <1291929171.2467.29.camel@luci> References: <1291919595.1624.8.camel@jam> <4D01257D.8070406@komitex.ru> <1291921830.2467.3.camel@luci> <4D012F96.5000009@komitex.ru> <1291926855.2467.21.camel@luci> <4D014364.7050401@komitex.ru> <1291929171.2467.29.camel@luci> Message-ID: <4D0148BE.4070903@komitex.ru> Да, есть вещи где без макросов не обойтись. Иногда они существенное подспорье в переносимости (бывает и такое) и отладке. В макрос можно подсунуть функцию, а вот в enum не получится, например. В целом, всё что в книге Practice of Programming - сущая правда. -- Г.А. Kargin Ruslan пишет: > Ну там не только про функции-макросы, но и про макросы-константы. Так > что, пожалуй, на сегодня использование макросов оставлено только для тех > ситуаций, где без них буквально не обойтись (то, что нельзя сделать > другими средствами языка). Ну а использование для флагов действительно > почти равноценно варианту с enum, за исключением того, что флаги > всё-таки связанные константы, и их всё же лучше в enum =) From sitkarev на komitex.ru Mon Dec 13 01:12:00 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 13 Dec 2010 00:12:00 +0300 Subject: [P&AM Lab] =?utf-8?b?0JrRgNCw0YLQutC+0LUg0KLQlyDQvdCwINGD0YLQuNC7?= =?utf-8?b?0LjRgtGDIGNhdCgxKQ==?= Message-ID: <4D053AA0.3090102@komitex.ru> Прошу ознакомиться с техническим заданием и браться за реализацию. Реализация в вашей версии Unix уже есть, поэтому можете экспериментировать с ней прежде чем начать писать свою. -- Г.А. ----------- следущая часть ----------- An embedded and charset-unspecified text was scrubbed... Name: cat.ascii URL: ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From lonely.ruyk на mail.ru Fri Dec 17 21:42:04 2010 From: lonely.ruyk на mail.ru (=?koi8-r?Q?=E2=CF=D2=C9=D3_=EC=C9=D0=C9=CE?=) Date: Fri, 17 Dec 2010 20:42:04 +0300 Subject: [P&AM Lab] =?koi8-r?b?KMLF2iDUxc3ZKQ==?= Message-ID: Здравствуйте. Посоветуйте какие-нибудь мануалы по gdb, пожалуйста. ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From sitkarev на komitex.ru Fri Dec 17 21:51:04 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Fri, 17 Dec 2010 20:51:04 +0300 Subject: [P&AM Lab] =?utf-8?b?KNCx0LXQtyDRgtC10LzRiyk=?= In-Reply-To: References: Message-ID: <4D0BA308.70406@komitex.ru> Боря, пиши пожалуйста в следующий раз тему. Если темы нет - сложно искать нить обсуждения. Вот перевод руководства на русский. http://mitya.pp.ru/gdb/gdb_toc.html Здесь оригинал. http://sourceware.org/gdb/current/onlinedocs/gdb/ -- Г.А. Борис Липин пишет: > Здравствуйте. > Посоветуйте какие-нибудь мануалы по gdb, пожалуйста. > From sitkarev на komitex.ru Sat Dec 18 09:04:16 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sat, 18 Dec 2010 08:04:16 +0300 Subject: [P&AM Lab] easyshell - UNIX job management Message-ID: <4D0C40D0.7000303@komitex.ru> Приветствую. Посмотрите. Я немножко облагородил первоначальную задумку. Распакуете архив и соберёте его выполнив make. Получите исполняемый файл easysh, его можно запускать сразу и баловаться. Переменные окружения не используются поэтому к программам исполняемым нужно писать полный путь. Здесь есть всё: fork, exec, kill, sigaction, setpgid, getpgid, tcsetpgrp и т.д. Работают встроенные команды: jobs fg bg Любую команду (задание) можно остановить послав Ctrl+Z, потом пролистать их всех встроенной командой jobs. Можно выносить остановленное задание в foreground и в background. После завершения background задач, оболочка печатает их статус. Наверное Миша изготовит для этой программы ветку в репозитории. -- Г.А. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: easysh.tar.gz Type: application/x-compressed-tar Size: 3796 bytes Desc: отсутствует URL: From ilyin_mikhail на inbox.ru Sat Dec 18 19:52:19 2010 From: ilyin_mikhail на inbox.ru (Mikhail Ilyin) Date: Sat, 18 Dec 2010 18:52:19 +0300 Subject: [P&AM Lab] =?koi8-r?b?ZWFzeXNoZWxsIC0gVU5JWCBqb2IgbWFuYWdlbWVu?= =?koi8-r?b?dA==?= In-Reply-To: <4D0C40D0.7000303@komitex.ru> References: <4D0C40D0.7000303@komitex.ru> Message-ID: > > Наверное Миша изготовит для этой программы ветку в репозитории. > Исходный код easyshell теперь доступен через svn репозиторий, по ссылке http://wiki.syktsu.ru/websvn удобный просмотрщик исходных кодов проектов, там же находится маленькая инструкция о том как можно скачать проект. From ilyaart90 на rambler.ru Wed Dec 22 15:07:01 2010 From: ilyaart90 на rambler.ru (=?windows-1251?B?yOv8/yDA8PLl5eI=?=) Date: Wed, 22 Dec 2010 14:07:01 +0300 Subject: [P&AM Lab] =?windows-1251?b?4iDv8O725fHx5SDt4O/o8eDt6P8gQ2F0?= Message-ID: <699540587.1293016021.501734728.18497@mcgi-wr-2.rambler.ru> пишу cat, на основе данного нам в пример cat BSD, возник вопрос а зачен нужна проверка if (fstat(fileno(stdout), &statb) == 0) { statb.st_mode &= S_IFMT; if (statb.st_mode != S_IFCHR && statb.st_mode != S_IFBLK) { ведь stdout в любом случае не символьный и не блоковый, по крайней мере до этого момента в исходном коде он не менялся From sitkarev на komitex.ru Wed Dec 22 15:20:58 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 22 Dec 2010 14:20:58 +0300 Subject: [P&AM Lab] =?utf-8?b?0LIg0L/RgNC+0YbQtdGB0YHQtSDQvdCw0L/QuNGB0LA=?= =?utf-8?b?0L3QuNGPIENhdA==?= In-Reply-To: <699540587.1293016021.501734728.18497@mcgi-wr-2.rambler.ru> References: <699540587.1293016021.501734728.18497@mcgi-wr-2.rambler.ru> Message-ID: <4D11DF1A.1040406@komitex.ru> Да, не менялся. Но он мог быть не символьным и не блочным с самого начала. Например, он мог быть каналом FIFO или сокетом. $ mknod /tmp/myfifo p $ cat - > /tmp/fifo И дальше вводим что-то с терминала. В другом терминале выводим из канала FIFO на стандартный вывод. $ cat /tmp/myfifo Можешь проверить что будет получаться. -- Г.А. Илья Артеев пишет: > пишу cat, на основе данного нам в пример cat BSD, возник вопрос а зачен > нужна проверка > > if (fstat(fileno(stdout), &statb) == 0) { > statb.st_mode &= S_IFMT; > if (statb.st_mode != S_IFCHR && statb.st_mode != S_IFBLK) { > ведь stdout в любом случае не символьный и не блоковый, по крайней > мере до этого момента в исходном коде он не менялся From sitkarev на komitex.ru Wed Dec 22 19:00:56 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 22 Dec 2010 18:00:56 +0300 Subject: [P&AM Lab] =?utf-8?b?0JLRgdGC0YDQtdGH0LAgMjkt0LPQviDQtNC10LrQsNCx?= =?utf-8?b?0YDRjyAtLSDQmNChLCDRgNC10YLRgNC+0YHQv9C10LrRgtC40LLQsCwg0L0=?= =?utf-8?b?0YvQvdC1INC4INCyINCx0YPQtNGD0YnQtdC8?= Message-ID: <4D1212A8.7000300@komitex.ru> Дорогие студенты и коллеги! 29-го декабря состоится встреча с интересным человеком, моим коллегой и другом. *"Информационные системы???ретроспектива, ныне и в будущем"* Встреча проводится в рамках студенческой учебно-исследовательской лаборатории прикладной математики и программирования. Приглашаются все желающие! Краткая биография докладчика */Кусакин Евгений Викторович/*, 1968 г.р. В настоящее время директор LICARD Serbia d.o.o. Beograd (Лукойл-Интер-Кард). Сфера деятельности компании???сегмент безналичных расчётов. Экс-директор консалтинговой компании, руководил проектами комплексной автоматизации предприятий нефтегазового комплекса. Окончил: * Краснодарское Высшее Военное Командно-Инженерное Училище Ракетных Войск * Курсы Военной академии РВСН им. Ф.Э.Дзержинского По окончанию доклада???свободная дискуссия. Время и место встречи 29 декабря, 11.00, 425-я аудитория. Возможны изменения???они будут объявлены в списке рассылки Lab на . -- Г.А. From lonely.ruyk на mail.ru Thu Dec 23 00:49:24 2010 From: lonely.ruyk на mail.ru (=?koi8-r?Q?=E2=CF=D2=C9=D3_=EC=C9=D0=C9=CE?=) Date: Wed, 22 Dec 2010 23:49:24 +0300 Subject: [P&AM Lab] =?koi8-r?b?d2hvIChCdXN5Qm94KffP0NLP0yDPIMbByszFIC92?= =?koi8-r?b?YXIvcnVuL3V0bXA=?= Message-ID: При разборе утилиты who возникли вопросы по структуре utmp, на сколько я понял в ней хранятся данные о пользователях в данный момент работающих в системе.Для проверки написал програмку: int main(int argc, char *argv[]) { struct utmp *ut; int i=0; setutent(); while((ut = getutent()) != NULL) { printf("%02d UT_ID=%s ut_type=%d ",i++ ,ut->ut_id, ut->ut_type); printf("pid=%d User-%s\n",ut->ut_pid, ut->ut_user); } return 0; } На выводе получилось: 00 UT_ID=si ut_type=8 pid=653 User- 01 UT_ID=~~ ut_type=2 pid=0 User-reboot 02 UT_ID=~~ ut_type=1 pid=20018 User-runlevel 03 UT_ID=l2 ut_type=8 pid=1651 User- 04 UT_ID=1 ut_type=6 pid=2459 User-LOGIN 05 UT_ID=2 ut_type=6 pid=2460 User-LOGIN 06 UT_ID=ts/0ruyk ut_type=7 pid=6870 User-ruyk 07 UT_ID=ts/7ruyk ut_type=8 pid=2736 User-ruyk Строки 04-07 - это информация о запущенных терминалах. А откуда взялись строки 00-03 и что они значат? ----------- следущая часть ----------- Вложение в формате HTML было извлечено… URL: From sitkarev на komitex.ru Thu Dec 23 05:12:54 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Thu, 23 Dec 2010 04:12:54 +0300 Subject: [P&AM Lab] =?utf-8?b?d2hvIChCdXN5Qm94KdCS0L7Qv9GA0L7RgSDQviDRhNCw?= =?utf-8?b?0LnQu9C1IC92YXIvcnVuL3V0bXA=?= In-Reply-To: References: Message-ID: <4D12A216.3060005@komitex.ru> Да, хранятся И о тех кто работает в системе тоже. Дело в том что в utmp есть кое-что ещё. Если бы ты внимательно посмотрел utmp(5) то нашёл бы там описание структуры utmp. По значениям полей ut_type там дана расшифровка. #define EMPTY 0 /* пустая запись */ ... #define BOOT_TIME 2 /* время загрузки системы в ut_tv */ ... #define DEAD_PROCESS 8 /* завершённый процесс */ -- Г.А. Борис Липин пишет: > При разборе утилиты who возникли вопросы по структуре utmp, на сколько я понял в ней хранятся данные о пользователях в данный момент работающих в системе.Для проверки написал програмку: > > int main(int argc, char *argv[]) > { > struct utmp *ut; > int i=0; > setutent(); > while((ut = getutent()) != NULL) { > printf("%02d UT_ID=%s ut_type=%d ",i++ ,ut->ut_id, ut->ut_type); > printf("pid=%d User-%s\n",ut->ut_pid, ut->ut_user); > } > return 0; > } > > На выводе получилось: > > 00 UT_ID=si ut_type=8 pid=653 User- > 01 UT_ID=~~ ut_type=2 pid=0 User-reboot > 02 UT_ID=~~ ut_type=1 pid=20018 User-runlevel > 03 UT_ID=l2 ut_type=8 pid=1651 User- > 04 UT_ID=1 ut_type=6 pid=2459 User-LOGIN > 05 UT_ID=2 ut_type=6 pid=2460 User-LOGIN > 06 UT_ID=ts/0ruyk ut_type=7 pid=6870 User-ruyk > 07 UT_ID=ts/7ruyk ut_type=8 pid=2736 User-ruyk > > Строки 04-07 - это информация о запущенных терминалах. А откуда взялись строки 00-03 и что они значат? From sitkarev на komitex.ru Sun Dec 26 21:57:26 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sun, 26 Dec 2010 20:57:26 +0300 Subject: [P&AM Lab] PAM -- pluggable authentication modules Message-ID: <4D178206.3070503@komitex.ru> Приветствую всех. Так как в субботу был разговор про PAM и эта тема оказалась интересной, и мы сказали А, теперь стоит сказать и Б. Стандарт X/Open на PAM и API к библиотекам опубликован Opengroup, прочитать его можно на их сайте: http://www.opengroup.org/onlinepubs/008329799/toc.htm Там довольно подробно всё расписано, много картинок. Linux PAM немного отличается от стандарта и есть свои "фирменные" (не переносимые) расширения, но о них я не буду. Теперь по примеру использования. Я сделал маленькую утилиту для проверки API PAM, если кто-то соберётся проверять, в Debian нужно установить пакет libpam-dev, т.к. там заголовки к библиотеке libpam. При компиляции нужно линковаться с библиотекой libpam конечно. $ gcc -Wall -o pamapp pamapp.c -lpam Есть две опции, -u и -s. Они позволяют задать имя пользователя и имя сервиса. Сервис конфигурируется отдельно в файлах с именем совпадающим с именем сервиса в каталоге /etc/pam.d. Например, если я хочу зайти пользователем sitkarev и использовать настройки PAM для login я запущу её так: $ ./pamapp -s login -u sitkarev Оба параметра опциональны. По умолчанию используется сервис login. Если имя пользователя не было передано параметром, то его запросит сам PAM. Дерзайте, может кто курсовик захочет делать. -- Г.А. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: pamapp.c Type: text/x-csrc Size: 5576 bytes Desc: отсутствует URL: From Lonely.RuyK на mail.ru Wed Dec 29 02:00:15 2010 From: Lonely.RuyK на mail.ru (LonelyRuyK) Date: Wed, 29 Dec 2010 01:00:15 +0300 Subject: [P&AM Lab] =?utf-8?b?0LLQvtC/0YDQvtGBINC+IC9kZXYvZHNw?= Message-ID: <201012290100.15658.Lonely.RuyK@mail.ru> Здравствуйте. Пытаюсь поэксперементировать с /dev/dsp, но он упорно не хочет открываться и выдаёт сообщение об ошибке(Device or resource busy ). Можно ли обойти ошибку не убивая все висящие на dsp процессы? Спасибо. From sitkarev на komitex.ru Wed Dec 29 16:25:26 2010 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Wed, 29 Dec 2010 15:25:26 +0300 Subject: [P&AM Lab] =?utf-8?b?0LLQvtC/0YDQvtGBINC+IC9kZXYvZHNw?= In-Reply-To: <201012290100.15658.Lonely.RuyK@mail.ru> References: <201012290100.15658.Lonely.RuyK@mail.ru> Message-ID: <4D1B28B6.8070404@komitex.ru> Боря, это не ошибка. Это так задумано было с самого начала. С OSS такая штука, доступ к /dev/dsp монопольно имеет только один процесс. Поэтому там над OSS обычно какая-то сверху ещё прослойка была. В KDE одно время использовался aRts, и для OSS приложений, открывающих и работающих с /dev/dsp напрямую, была обвёртка artsdsp(1). В pulseaudio для OSS тоже есть обвёртка, padsp(1). $ artsdsp ./my_prog file.wav Фактически, они настраивают окружение запуска так что все обращения к /dev/dsp обворачиваются в вызовы API микшера звуковой подсистемы. Это делается обычно через LD_PRELOAD и перекрытие функций других библиотек. Поэтому тебе надо или грохать все процессы кто пользует устройство, использовать API конкретной звуковой подсистемы или использовать OSS-обвёртку. У них она называется "OSS wrapper". -- Г.А. LonelyRuyK пишет: > Здравствуйте. > Пытаюсь поэксперементировать с /dev/dsp, но он упорно не хочет > открываться и выдаёт сообщение об ошибке(Device or resource busy > ). Можно ли обойти ошибку не убивая все висящие на dsp процессы? > Спасибо.