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

Все о программировании под *nix
Аватара пользователя
Speccyfan
Неотъемлемая часть форума
Сообщения: 540
Зарегистрирован: 18 дек 2004, 15:15
Откуда: Polotsk
Контактная информация:

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

Сообщение 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 все работало.

Как бы побороть ?
Best Regards, Yury Konovalov aka Speccyfan (2:453/53)
Registered Linux User #379588

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

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

Аватара пользователя
Speccyfan
Неотъемлемая часть форума
Сообщения: 540
Зарегистрирован: 18 дек 2004, 15:15
Откуда: Polotsk
Контактная информация:

Сообщение Speccyfan »

Спасибо, если ничего не получится воспользуюсь Вашим советом, хотя и не считаю, что это правильнее.
Best Regards, Yury Konovalov aka Speccyfan (2:453/53)
Registered Linux User #379588

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

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

Аватара пользователя
sanitar
Неотъемлемая часть форума
Сообщения: 1116
Зарегистрирован: 28 ноя 2002, 02:23
Откуда: Минск

Сообщение sanitar »

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

:roll:
I'll kill this code without a knife -- with only fork().

Аватара пользователя
Pasha
Неотъемлемая часть форума
Сообщения: 554
Зарегистрирован: 06 окт 2002, 12:39
Откуда: Southampton
Контактная информация:

Сообщение Pasha »

А покажи мне /dev/eth0 :-P

Аватара пользователя
Speccyfan
Неотъемлемая часть форума
Сообщения: 540
Зарегистрирован: 18 дек 2004, 15:15
Откуда: Polotsk
Контактная информация:

Сообщение Speccyfan »

Кстати когда делаю
echo 1 > /dev/lp0
Похоже ожидается сигнал busy и все висит.
Best Regards, Yury Konovalov aka Speccyfan (2:453/53)
Registered Linux User #379588

Аватара пользователя
sanitar
Неотъемлемая часть форума
Сообщения: 1116
Зарегистрирован: 28 ноя 2002, 02:23
Откуда: Минск

Сообщение sanitar »

/dev/eth0 -- ай досадное упушение :)

man kill в списке сигналов сигнала BUSY не показал
I'll kill this code without a knife -- with only fork().

Aleksey Kondratenko
Неотъемлемая часть форума
Сообщения: 250
Зарегистрирован: 12 авг 2003, 03:55
Контактная информация:

Сообщение Aleksey Kondratenko »

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

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

Aleksey Kondratenko
Неотъемлемая часть форума
Сообщения: 250
Зарегистрирован: 12 авг 2003, 03:55
Контактная информация:

Сообщение Aleksey Kondratenko »

Да, только перед тем как лезть через in/out надо зделать ioperm или iopl.

Аватара пользователя
Pasha
Неотъемлемая часть форума
Сообщения: 554
Зарегистрирован: 06 окт 2002, 12:39
Откуда: Southampton
Контактная информация:

Сообщение Pasha »

sanitar писал(а):/dev/eth0 -- ай досадное упушение :)

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

Аватара пользователя
sanitar
Неотъемлемая часть форума
Сообщения: 1116
Зарегистрирован: 28 ноя 2002, 02:23
Откуда: Минск

Сообщение sanitar »

Видимо решили не давать в руки пингвиноводам такое страшное оружие :)

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

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

:)
I'll kill this code without a knife -- with only fork().

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

в соляре кажись /dev/le это называется ;)

sanitar, но ведь к /dev/tun можно адресоваться ;)
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
sanitar
Неотъемлемая часть форума
Сообщения: 1116
Зарегистрирован: 28 ноя 2002, 02:23
Откуда: Минск

Сообщение sanitar »

Ну ладно, ладно, уговорили

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

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

Вот. Так что нефикъ.
I'll kill this code without a knife -- with only fork().

Аватара пользователя
Pasha
Неотъемлемая часть форума
Сообщения: 554
Зарегистрирован: 06 окт 2002, 12:39
Откуда: Southampton
Контактная информация:

Сообщение Pasha »

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

Ответить