Страница 1 из 1

C++, кинуть байт в порт принтера

Добавлено: 11 янв 2005, 09:28
Speccyfan
Хочется на C++ кинуть байт в порт, вот нашел такой пример:

include <stdio.h>
#include <asm/io.h>
#include <unistd.h>
#define BASEPORT 0x378 /* lpt1 */

main()
{
outb(0, BASEPORT);
exit (0);
}

А она не компилирует :( А вот что говорит:

[speccyfan@localhost programming]$ gcc -o drive drive.c
In file included from /usr/include/linux/config.h:4,
from /usr/include/asm/io.h:4,
from drive.c:2:
/usr/include/linux/autoconf.h:1:2: #error Invalid kernel header included in userspace
[speccyfan@localhost programming]$

/usr/include/linux/autoconf.h содержит только одну строку:
#error Invalid kernel header included in userspace

gcc у меня вот такой:
i586-alt-linux-gcc (GCC) 3.3.3 20040412 (ALT Linux, build 3.3.3-alt5)
Раньше под ALT Linux Master2.2 все работало.

Как бы побороть ?

Добавлено: 11 янв 2005, 13:16
Llama
Ну откуда привычка решать тривиальные задачи через задницу?
echo 1 > /dev/lp0 чем не устраивает?
Сишный эквивалент думаю сам настрогаешь.

Добавлено: 11 янв 2005, 14:42
Speccyfan
Спасибо, если ничего не получится воспользуюсь Вашим советом, хотя и не считаю, что это правильнее.

Добавлено: 11 янв 2005, 14:57
Llama
Speccyfan, бедншь смеяться - это НАМНОГО правильнее. Ибо работать напрямую с аппаратурой в unix не принято. Мой пример будет работать из-под любого пользователя, который имеет права на доступ к файлу /dev/lp0. А напрямю писать по портам ты можешь только из-под рута, причем придется пользовать "нежелательные" функции. Т.е. правильное решение писать файл до тех пор, пока файловые интерфейс удовлетворяет тебя своей функциональностью.

Добавлено: 11 янв 2005, 23:30
sanitar
Ибо один из главных прицнипов юникса -- все что можно представить в виде файлов, представлено в виде файлов.
Все что нельзя -- в виде псевдофайлов.

:roll:

Добавлено: 12 янв 2005, 01:34
Pasha
А покажи мне /dev/eth0 :-P

Добавлено: 12 янв 2005, 09:48
Speccyfan
Кстати когда делаю
echo 1 > /dev/lp0
Похоже ожидается сигнал busy и все висит.

Добавлено: 12 янв 2005, 14:59
sanitar
/dev/eth0 -- ай досадное упушение :)

man kill в списке сигналов сигнала BUSY не показал

Добавлено: 12 янв 2005, 17:27
Aleksey Kondratenko
Иногда прямой доступ к портам нужет. Чтобы скомпилировать данный код, можно просто скопировать определения {in,out}{b,w} из h-ников ядра.

Есть и более прикольный метод. См. man 4 port.

Добавлено: 12 янв 2005, 17:37
Aleksey Kondratenko
Да, только перед тем как лезть через in/out надо зделать ioperm или iopl.

Добавлено: 12 янв 2005, 23:01
Pasha
sanitar писал(а):/dev/eth0 -- ай досадное упушение :)

Не, ну серьёзно - по какой причине он в линуксе отсутствует? Во FreeBSD лежит в /dev/net/ =)

Добавлено: 12 янв 2005, 23:32
sanitar
Видимо решили не давать в руки пингвиноводам такое страшное оружие :)

С другой стороны -- сетевой интерфейс не имеет смысла сам по себе, без наличия чего-либо на другом конце кабеля, к нему подсоединенного.

Поэтому логика есть и в линуксявом подходе -- ведь нет смысла например, адресоваться к шлейфу жесткого диска как к отдельному устройству.
Или есть?

:)

Добавлено: 13 янв 2005, 01:00
Llama
в соляре кажись /dev/le это называется ;)

sanitar, но ведь к /dev/tun можно адресоваться ;)

Добавлено: 13 янв 2005, 12:10
sanitar
Ну ладно, ладно, уговорили

"ЛЮНИХ-ФУФЛО" и все такое :)

Я ваще исходно говорил о юниксовых принципах, а не о линуксовых.

Вот. Так что нефикъ.

Добавлено: 13 янв 2005, 19:33
Pasha
Народ требует /dev/eth0!!!
P.S. А как PROMISC режим на карточку ставится вообще? ioctl()'ом? Тогда на какой файл?