LINUX.ORG.RU

Работа с терминалами на C


0

0

Привет!

Решил посмотреть, как работать с терминалами на C в линуксе. Открываю терминал /dev/tty0 с помощью open() и читаю оттуда в буфер с помощью read() - мне вываливается куча галиматьи. А как собственно считывать ввод пользователя с терминала, причем с терминала, к которому данная программа не относится(т.е. не /dev/tty)?

Дайте, пожалуйста, ссылок на доки и примеры.

Вот мой код:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char *argv[])
{
	int term;
	char buf[255];
	
	term = open("/dev/tty0", O_RDWR | O_NOCTTY | O_NDELAY);
	while(read(term, buf, sizeof(buf)-1))
		for(int i = 0; i < sizeof(buf) - 1; i++)
			printf("%c", buf[i]);
	return EXIT_SUCCESS;
}

anonymous

   while(read(term, buf, sizeof(buf)-1))
      for(int i = 0; i < sizeof(buf) - 1; i++)
         printf("%c", buf[i]);

зачем ты выводишь потенциально неинициализированные данные? смотри сколько read() в буфер записал (через возвращаемое им значение).

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

ну и, конечно, такой while на ошибках элементарно будет делать не то что нужно. подумай над этим.

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

Насчет while() не совсем понял. Можно ли раскрыть мысль?

Сейчас то, что получается, эмулирует зажатие Enter'а(причем во всех приложениях, в текстовом редакторе, например, текст бесконечно уползает вниз, как будто я зажал ентер, хотя я к клавиатуре не прикасаюсь). Я хочу поработать с терминалом на моей машине, т.е. не идет речи о работе с com-портом. Просто хочу приконнектиться к консоли и считать оттуда ввод, например.

Вот как выглядит код на данный момент:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>

int main(int argc, char *argv[])
{
	int term;
	char buf[255];
	int buf_size = 0;
	
	term = open("/dev/tty0", O_RDWR | O_NOCTTY | O_NDELAY);
	if(term == -1) 
	{
		printf("Error opening term\n");
		return -1;
	};
	if(!isatty(term)) 
	{
		printf("Not a valid terminal!\n");
		return -2;
	};
	while(1)
	{
		for(int i = 0; i < buf_size; i++)
			printf("%c", buf[i]);
		buf_size = read(term, buf, sizeof(buf)-1);
	};
	return EXIT_SUCCESS;
}

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

>Можно ли раскрыть мысль?

можно. man 2 read

секция RETURN VALUE

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

А /dev/tty0 это не текущая (current) консоль?

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