LINUX.ORG.RU

write/read как ими пользоваться?


0

0

нет, ну никто не спорит что для вывода в файл конечно уместно использовать stdio.h(<f>print<f><k>), но вот незадача при подсоединении к модулю ядра этой библиотеки возникает мягко сказать много ошибок на стадии компиляции. Подскажите плиз неискушенному, но очень любопытному линуксоиду, а лучше небольшой примерчик, если можно, как выводить в произвольный файл текстовые строчки с использованием именно write/read(), а то чего-то я запутался в трех соснах, право стыдно

int main(void) {
int		fd = open("logfile", O_RDWR | O_APPEND | O_CREAT , 0644);
    WriteToFile(fd, "%s %s", "Some", "data");
    close(fd);
    return(0);
}

int WriteToFile(int fd, char * format, ...) {
/*	
	Описание:	Записывает format в файл fd	
*/
	va_list arg_ptr;
	va_start(arg_ptr, format);
	
	char	buf[MAX_BUF] = "\0";
	
	vsnprintf(buf, sizeof(buf), format, arg_ptr);
	
	if (write(fd, buf, strlen(buf)) != strlen(buf)) {
		va_end(arg_ptr);
		return(-1);
	}
	
	va_end(arg_ptr);
	return(0);
}

klon
()

>но вот незадача при подсоединении к модулю ядра этой библиотеки

если думаете что в модуле ядра можно пользоваться read/write то мягко говоря
заблуждаетесь. Это тоже самое как доказывать аксиому с помощью полученной из нее теоремы.

fghj ★★★★★
()
Ответ на: комментарий от fghj

ну тогда как же выводить в файл? вы первый кто сказал почти правду, я уже затрахался пытаться вывести что-либо таким образом, но от знания как нельзя, как можно не приходит, может что-нибудь дельное посоветуете, плиз

akornell
() автор топика
Ответ на: комментарий от akornell

> ну тогда как же выводить в файл?

это FAQ. стандартный и в-общем правильный ответ - не
надо этого делать.

ну если уж очень хочется, смотритеfs/exec.c:kernel_read().
запись аналогично.

idle ★★★★★
()
Ответ на: комментарий от akornell

Я конечно в этом деле не ГУРУ и могу ошибиться, но всеже попробую помочь ...
1. Неплохоб иметь коке какие познание о VFS ядра (Virtual File System).
2. Копать нужно от сюда 'filp_open' смотри файл /usr/src/linux/include/linux/fs.h
filp_open - вернеть тебе структуру с описанием файла
3. В этой структуре (file) есть указатель f_op - операции с файлом
4. Среди файловых операций есть операции записи и чтения

А вообще геморойно это все, там нужно следить за адресными пространствами и тд., лутше написать прогу которая будет передовать необходимые данные в ядро и пускать ее в юзерспейсе


zaz ★★★★
()
Ответ на: комментарий от SatanClaus

спасибо огромное всем за участие, ухожу на обработку полученной инфы I'll be back:-)

akornell
() автор топика
Ответ на: комментарий от SatanClaus

Доброе время суток.

А не подскажете (ссылочку или просто) как можно из режима ядра открыть COM-порт, установить его параметры, зачитать/записать данные?

Можно ли это осуществить каким-нибудь способом, похожим на то, как это делается в user-space, а не с "железячным" портом работать?

Чё-то типа такого:

fd = open("/dev/ttyS0", O_RDWR);
struct termios options;
tcgetattr(...);
...
tcsetattr(...);
cfispeed(...);
cfospeed(...);
write(fd, buf, sz);
read(fd, buf, sz);
close(fd);

Спасибо.

Михаил.

anonymous
()
Ответ на: комментарий от anonymous

>А не подскажете (ссылочку или просто) как можно из режима ядра
> открыть COM-порт, установить его параметры, зачитать/записать
> данные?

Глянь в
/usr/src/linux/include/linux/tty.h
я бы попробывал перебрать устройства через "tty_ldisc_get" и найти нужный драйвер.

Но это все в корне не правильно, нужно это все выносить в юзерспейс - хороший пример это pppd - юзерспейс мост между двумя драйверами (ppp и ttyS).

zaz ★★★★
()
Ответ на: комментарий от zaz

Спасибо за ответы.

А почему "в корне не правильно"? Если есть девайс, подключаемый к COM-порту, и есть желание написать для него драйвер...? :)

Михаил.

anonymous
()
Ответ на: комментарий от anonymous

>Если есть девайс, подключаемый к COM-порту, и есть желание написать для него драйвер...? :)

"Драйвер" - совершенно не обязательно kernel-space.
Примеры: "драйверы" принтеров в CUPS, "драйверы" UPS в NUT.
Если можно необходимую функциональность реализовать в юзер-спейс, зачем в ядро лезть?

VovanE
()
Ответ на: комментарий от VovanE

Мож я чё не понимаю.... я не большой специалист по части написания драйверов. (всё знакомство с этой темой у меня заключается в нескольких прочитанных главах LDDv3)

драйвер я пишу с тем, чтобы он обрабатывал обращение к моему устройству через /dev/my_device. Т.е. вместо того, чтобы открывать порт, устанавливать его параметры, посылать команды и данные, читать и анализировать возвращаемые коды, можно было бы просто открыть на запись/чтение файл /dev/my_device и писать/читать его.

Можно ли это реализовать с помощью user-space драйверов? Если да, то как? Куда читать? :)

Спасибо.

Михаил.

anonymous
()
Ответ на: комментарий от anonymous

Можно (и очень легко) реализовать юзер спейс устройства (по аналогии с FUSE - юзер спейс драйвера файловых систем), в принципе ничего сложного в этом нет, я думаю гораздо проще чем работать c /dev/ttyS* из ядра. Если есть желание и потребность можеш сделать фреймворк, я думаю народ применение данной приблуде найдет :)
Правда производительность данных драйверов не сильно большая будет - но для большенства случаев это и не нужно (ком порт он сам по себе медленный)

zaz ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.