Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: подскажите плз по программированию под линукс
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
vhlshik
подскажите плз!
мне надо написать програмку под линукс на обычный х86.
не могу найти аналогов досовских функций kbhit (возвращает единицу, если была нажата клавиша) и findfirst/findnext (поиск файлов). Есть ли что-то подобное под линуксом?
sK0T
Цитата(vhlshik @ Sep 18 2005, 00:57)
подскажите плз!
мне надо написать програмку под линукс на обычный х86.
не могу найти аналогов досовских функций kbhit (возвращает единицу, если была нажата клавиша) и findfirst/findnext (поиск файлов). Есть ли что-то подобное под линуксом?
*


1) А какая собственно разница, какая архитектура? UNIX (и пародия на него GNU/linux) он для того и придуман в оригинале, что-бы и на супер-компьютере и на настольном калькуляторе всё было одинаково.
2) Ну хоть бы сказали, на чём пишете, прежде чем такие вопросы задавать. Помоему, сомневаться в том, что в системе можно получить единицу в ответ на нажатие клавиши и поискать файлы — по крайней мере неблагоразумно. Вообще названьица существенно паскакаль напоминают… Если это и правда паскакаль, то есть проект Free Pascal (хотя писать на паскале — зло).

Ну и как всегда — поиск ещё никто не отменял. Первая ссылка на гугле — «BORLAND LINUX (KBHIT, Sleep etc)»

И вообще, переходите на FreeBSD! :-)
vhlshik
пользуюсь ессно сишником.
у борланда и майкрософта такие функции есть (обычно в файле io.h).
но использовать их продукты не хочется. должно быть что-то подобное в стандартных линуховых библиотеках
bmf
А google не пробовал?
kbhit posix
findfirst posix
Olej
Цитата(vhlshik @ Sep 17 2005, 23:57)
мне надо написать програмку под линукс на обычный х86.
не могу найти аналогов досовских функций kbhit (возвращает единицу, если была нажата клавиша) и findfirst/findnext (поиск файлов). Есть ли что-то подобное под линуксом?
*


Не нужно пробовать никакой google... wink.gif

1. Это не важно, "обычный" х86, или самый "необычны" ... вас интересует использовать набор функций, из числа определённых в POSIX, которые к платформе не относятся...

2. ... а почему, собственно, в стандарте POSIX, который развивается, исправляется, дополняется, обсуждается эдак лет ... 35 - должны быть "приблуды" (kbhit, findfirst/findnext, и ещё многое другое...) придуманные MS для какого-то DOS? У вас принципиально неправильный подход: искать в POSIX эквиваленты "приблудам", вместо этого лучше обстоятельно посидеть над POSIX...

3. относительно ваших функций:

3.1. kbhit - в POSIX любой ввод может быть блокирующий или неблокирующий, поэтому необходимости в таком безобразии как kbhit не возникает... Вам достаточно перевести ваш поток ввода в неблокирующий режим, ... напр. см. fctl() со 2-м аргументом F_SETFL и 3-м O_NONBLOCK (или O_NDELAY в POSIX). Для SYSIN это можно сделать и проще, установками setbuf() (может я и ошибся в названии функции, давно не пользовался, но что-то такое...). После этого простейший getc() (и любая функция ввода) будет вам и источником информации - был ли фактический ввод.

3.2. findfirst/findnext - см. dirent.h.
Что-то типа:
Код
   DIR* dirp = opendir( "/bla-bla-bla" );
   if( dirp == NULL )
      cout << "no directopy!" << endl, exit( EXIT_FAILURE );
   struct dirent* direntp;
   for( int i = 0;; i++ ) {
       if( ( direntp = readdir( dirp ) ) == NULL ) break;
       cout << direntp->d_name << endl;
       // ... делаете ещё что с найденным именем в каталоге
  };

- это работающий код из QNX, но я сильно предполагаю (я не проверял компиляцию в Linux), что он не меняя ни буквы будет тот-же и в Linux (всё это чисто POSIX API).
Структуры и типы (dirent и др.) см. dirent.h.
А все вызовы API работы с каталогами (opendir(), readdir(), closedir(), seekdir(), telldir(), ...):
$ man <имя_функции>

... этого более чем достаточно wink.gif.
vhlshik
great thanks 2 Olej
fcntl действительно работает, а по readdir нашел то, что мне надо - scandir
ReAl
Цитата(Olej @ Sep 18 2005, 22:47)
3.2. findfirst/findnext - см. dirent.h.
Что-то типа:
Код
   DIR* dirp = opendir( "/bla-bla-bla" );
   if( dirp == NULL )
      cout << "no directopy!" << endl, exit( EXIT_FAILURE );
   struct dirent* direntp;
   for( int i = 0;; i++ ) {
       if( ( direntp = readdir( dirp ) ) == NULL ) break;
       cout << direntp->d_name << endl;
       // ... делаете ещё что с найденным именем в каталоге
  };

- это работающий код из QNX, но я сильно предполагаю (я не проверял компиляцию в Linux), что он не меняя ни буквы будет тот-же и в Linux (всё это чисто POSIX API).
Структуры и типы (dirent и др.) см. dirent.h.
А все вызовы API работы с каталогами (opendir(), readdir(), closedir(), seekdir(), telldir(), ...):
*

"Вы будете смеяться", но ЭТО работает и под MS DOS (borland C, всё тот же dirent.h)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.