shell 0.5 could run console apps

git-svn-id: svn://kolibrios.org@2502 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Albom 2012-03-23 18:53:16 +00:00
parent 1386fef88b
commit 762c577e6a
15 changed files with 336 additions and 23 deletions

View File

@ -0,0 +1,23 @@
Shell 0.5 // 23.03.2012 // Albom
=======================================
* Добавлена поддержка консольных приложений, которые общаются с шеллом через именованную область
Консольное приложение может быть написано на любом языке программирования - это обыкновенная программа для КолибриОС.
1) Консольное приложение после своего запуска В ПЕРВУЮ ОЧЕРЕДЬ должно создать именованную область с именем pid-SHELL, где pid - идентификатор процесса с заглавными нулями,
например: 42 -> 0042 (т.е. сейчас ограничение до 9999).
+ нужно сделать, чтобы программа корректно завершалась, если запущена не из шелла (СЕЙЧАС НЕ РЕАЛИЗОВАНО!!!)
2) Первый байт области - команда (т.е. максимум 255 команд), далее - данные (могут отсутствовать).
Список команд для версии 0.5:
SC_OK 0 ничего не делать
SC_EXIT 1 выход
SC_PUTC 2 вывести на экран символ
SC_PUTS 3 вывести на экран строку
SC_GETC 4 считать с клавиатуры символ
SC_GETS 5 считать с клавиатуры строку
SC_CLS 6 очистить экран
3) Программа должна САМА заботиться о рациональном использовании процессорного времени.
4) Программа должна САМА заботиться о закрытии именованной области.

View File

@ -1,22 +1,32 @@
Shell 0.5 // 23.03.2012 // Albom
=======================================
* Добавлена поддержка консольных приложений, которые общаются с шеллом через именованную область
Shell 0.4.6 // 30.01.2011 // Albom Shell 0.4.6 // 30.01.2011 // Albom
=======================================
* Временно удалены команды killall и ccpuid (чтобы вернуть, необходимо раскомментировать 2 строчки) * Временно удалены команды killall и ccpuid (чтобы вернуть, необходимо раскомментировать 2 строчки)
* Исправления в текстовых строках * Исправления в текстовых строках
Shell 0.4.52 // 25.10.2010 // Pterox Shell 0.4.52 // 25.10.2010 // Pterox
======================================= =======================================
* Добавлена команда "killall" - убивает все процессы кроме OS/IDLE. * Добавлена команда "killall" - убивает все процессы кроме OS/IDLE.
* Фиксы * Фиксы
Shell 0.4.51 // 21.10.2010 // Pterox Shell 0.4.51 // 21.10.2010 // Pterox
======================================= =======================================
* Команда "turnoff" переименована в "shutdown", "kerver" удалена - теперь её заменяет "ver kernel"; фиксы. * Команда "turnoff" переименована в "shutdown", "kerver" удалена - теперь её заменяет "ver kernel"; фиксы.
Shell 0.4.5 // 19.10.2010 // Pterox Shell 0.4.5 // 19.10.2010 // Pterox
======================================= =======================================
Программа теперь многоязыковая (английский, и русский язык). Программа полностью русифицированна. Программа теперь многоязыковая (английский, и русский язык). Программа полностью русифицированна.
* Команда "free" переименована в "memory" - для точности. * Команда "free" переименована в "memory" - для точности.
* Добавлены команды turnoff (выключить компьютер), kerver (версия ядра KoOS), uptime; reboot теперь может перезагружать ядро ("reboot kernel") * Добавлены команды turnoff (выключить компьютер), kerver (версия ядра KoOS), uptime; reboot теперь может перезагружать ядро ("reboot kernel")
Shell 0.4.4 // 20.08.2010 // Albom Shell 0.4.4 // 20.08.2010 // Albom
======================================= =======================================
1) шелл корректно завершается при закрытии окна 1) шелл корректно завершается при закрытии окна
@ -29,19 +39,23 @@ Shell 0.4.4 // 20.08.2010 // Albom
1) добавить переменную (одну!), в которую будет результат в текстовой форме (не то что возвращает ф-ция) записываться. с ней можно будет работать из командной строки. 1) добавить переменную (одну!), в которую будет результат в текстовой форме (не то что возвращает ф-ция) записываться. с ней можно будет работать из командной строки.
2) внедрить простую стековую машину для вычислений с вещественными числами. 2) внедрить простую стековую машину для вычислений с вещественными числами.
Shell 0.4.3 // 20.08.2010 // Albom Shell 0.4.3 // 20.08.2010 // Albom
======================================= =======================================
* Смесь версий 0.4.1 и 0.4.2. Теперь в архиве все исходные файлы, необходимые для компиляции (раньше использовались объектники с моими обёртками, исходники я с шеллом не выкладывал) * Смесь версий 0.4.1 и 0.4.2. Теперь в архиве все исходные файлы, необходимые для компиляции (раньше использовались объектники с моими обёртками, исходники я с шеллом не выкладывал)
Shell 0.4.2 // 28.08.2009 // diamond Shell 0.4.2 // 28.08.2009 // diamond
======================================= =======================================
* Добавил корректное завершение работы при закрытии окна консоли, работает только начиная с последней на данный момент версией библиотеки (лежит на svn, включена в ночную сборку). Перекомпилировал в VS2008 с LTCG, ещё пошаманил с оптимизацией по размеру. * Добавил корректное завершение работы при закрытии окна консоли, работает только начиная с последней на данный момент версией библиотеки (лежит на svn, включена в ночную сборку). Перекомпилировал в VS2008 с LTCG, ещё пошаманил с оптимизацией по размеру.
Shell 0.4.1 // 16.03.2009 // Albom Shell 0.4.1 // 16.03.2009 // Albom
======================================= =======================================
* версия с исправленными ошибками. * версия с исправленными ошибками.
* работает команда alias, добавлена команда clear. * работает команда alias, добавлена команда clear.
Shell 0.4 // 12.08.2008 // Albom Shell 0.4 // 12.08.2008 // Albom
======================================= =======================================
1) Работает схема псевдонимов (до 256 команд) 1) Работает схема псевдонимов (до 256 команд)
@ -68,6 +82,7 @@ shell /sys/somescript
- просмотр текстовых и бинарных файлов (вроде бы задача простая, но пришлось повозиться с управляющими символами) - просмотр текстовых и бинарных файлов (вроде бы задача простая, но пришлось повозиться с управляющими символами)
- очень не рекомендуется просматривать большие файлы - очень не рекомендуется просматривать большие файлы
Shell 0.3 // 07.08.2008 // Albom Shell 0.3 // 07.08.2008 // Albom
======================================= =======================================
1) Возможность запуска скриптов. 1) Возможность запуска скриптов.
@ -84,20 +99,24 @@ Shell 0.3 // 07.08.2008 // Albom
* до 256 (можно изменить при компиляции) синонимов * до 256 (можно изменить при компиляции) синонимов
* пока работает только добавление и просмотр синонимов, а отработка пока не реализована. * пока работает только добавление и просмотр синонимов, а отработка пока не реализована.
Shell 0.2 // 04.08.2008 // Albom Shell 0.2 // 04.08.2008 // Albom
======================================= =======================================
* добавил новые функции * добавил новые функции
* написал собственную процедуру ввода команды * написал собственную процедуру ввода команды
Shell 0.11 // 01.08.2008 // Albom Shell 0.11 // 01.08.2008 // Albom
======================================= =======================================
* Добавил команды free и reboot, внёс некоторые изменения, исправил найденные ошибки. * Добавил команды free и reboot, внёс некоторые изменения, исправил найденные ошибки.
Shell 0.1 // 29.07.2008 // Albom Shell 0.1 // 29.07.2008 // Albom
======================================= =======================================
* Реализованы (не полностью) команды: about, cd, date, echo, exit, help, kill, ls, ps, pwd, ver * Реализованы (не полностью) команды: about, cd, date, echo, exit, help, kill, ls, ps, pwd, ver
* При запуске программы (если не указан полный путь) она ищется в каталоге /rd/1 и текущем каталоге. * При запуске программы (если не указан полный путь) она ищется в каталоге /rd/1 и текущем каталоге.
Shell 0.02 // 27.07.2008 // Albom Shell 0.02 // 27.07.2008 // Albom
======================================= =======================================
* Реализовал команды: * Реализовал команды:
@ -108,6 +127,7 @@ Shell 0.02 // 27.07.2008 // Albom
kill - завершить процесс по PID kill - завершить процесс по PID
help (с параметром и без) - помощь help (с параметром и без) - помощь
Shell 0.01 // 27.07.2008 // Albom Shell 0.01 // 27.07.2008 // Albom
======================================= =======================================
* Решил написать функциональный шелл на Си с использованием console.obj. * Решил написать функциональный шелл на Си с использованием console.obj.

View File

@ -44,6 +44,7 @@
#include "cmd/cmd_killall.c" #include "cmd/cmd_killall.c"
#include "modules/module_command.c" #include "modules/module_command.c"
#include "modules/module_program_console.c"
#include "modules/module_program.c" #include "modules/module_program.c"
#include "modules/module_script.c" #include "modules/module_script.c"
#include "modules/module_executable.c" #include "modules/module_executable.c"

View File

@ -5,8 +5,6 @@ int cmd_ps(char param[])
int i, n; int i, n;
char *buf1k; char *buf1k;
unsigned PID; unsigned PID;
unsigned *p;
short *s;
short STATE; short STATE;
buf1k = malloc(1024); buf1k = malloc(1024);
@ -16,10 +14,8 @@ if (NULL == buf1k)
for (i = 1;;i++) for (i = 1;;i++)
{ {
n = kol_process_info(i, buf1k); n = kol_process_info(i, buf1k);
p = buf1k+30; PID = *(buf1k+30);
PID = *p; STATE = *(buf1k+50);
s = buf1k+50;
STATE = *s;
if ( 9 != STATE) if ( 9 != STATE)
printf (" %7d %s\n\r", PID, buf1k+10); printf (" %7d %s\n\r", PID, buf1k+10);
if (i == n) if (i == n)

View File

@ -9,7 +9,7 @@ gcc -c system/string.c
gcc -c system/ctype.c gcc -c system/ctype.c
ld -nostdlib -T kolibri.ld -o shell start.o kolibri.o stdlib.o string.o ctype.o shell.o ld -nostdlib -T kolibri.ld -o shell start.o kolibri.o stdlib.o string.o ctype.o shell.o
objcopy shell -O binary objcopy shell -O binary
erase lang.h start.o shell.o kolibri.o stdlib.o string.o erase lang.h start.o shell.o kolibri.o stdlib.o string.o ctype.o
kpack shell kpack shell
move shell bin\rus\ move shell bin\rus\
copy locale\rus\.shell bin\rus\ copy locale\rus\.shell bin\rus\

View File

@ -0,0 +1,14 @@
@echo off
fasm start.asm start.o
gcc -c test.c
gcc -c system/kolibri.c
gcc -c system/stdlib.c
gcc -c system/string.c
gcc -c system/ctype.c
ld -nostdlib -T kolibri.ld -o test start.o kolibri.o stdlib.o string.o ctype.o test.o
objcopy test -O binary
erase start.o kolibri.o stdlib.o string.o ctype.o test.o
kpack test
copy test bin\eng\
move test bin\rus\
pause

View File

@ -1,5 +1,5 @@
#define SHELL_VERSION "0.4.91" #define SHELL_VERSION "0.5"
extern char PATH[256]; extern char PATH[256];
extern char PARAM[256]; extern char PARAM[256];

View File

@ -49,11 +49,15 @@ if ( script_check(exec) )
result = program_run(exec, args); result = program_run(exec, args);
if (result > 0) if (result > 0)
{ {
if ( !program_console(result) )
{
#if LANG_ENG #if LANG_ENG
printf (" '%s' started. PID = %d\n\r", cmd, result); printf (" '%s' started. PID = %d\n\r", cmd, result);
#elif LANG_RUS #elif LANG_RUS
printf (" '%s' § ¯ã饭. PID = %d\n\r", cmd, result); printf (" '%s' § ¯ã饭. PID = %d\n\r", cmd, result);
#endif #endif
}
return TRUE; return TRUE;
} }
else else

View File

@ -0,0 +1,95 @@
#include "../program_console.h"
int program_console(int pid)
{
char name[32];
char *buffer;
int result;
int i;
char command;
int size;
int is_end;
_itoa(pid, name);
strcat(name, "-SHELL");
buffer = NULL;
for (i = 0; i < 30; i++)
{
result = kol_buffer_open(name, SHM_OPEN | SHM_WRITE, 0, &buffer);
if (buffer != NULL)
break;
kol_sleep(2);
}
if (buffer == NULL)
return 0;
else
size = result;
is_end = 0;
for (;;)
{
command = *(buffer);
switch (command)
{
case SC_EXIT:
*buffer = SC_OK;
is_end = 1;
break;
case SC_OK:
kol_sleep(5);
break;
case SC_CLS:
con_cls();
*buffer = SC_OK;
break;
case SC_PUTC:
printf("%c", *(buffer+1));
*buffer = SC_OK;
break;
case SC_PUTS:
printf("%s", buffer+1 );
*buffer = SC_OK;
break;
case SC_GETC:
*(buffer+1) = (char) getch() ;
*buffer = SC_OK;
break;
case SC_GETS:
gets(buffer+1, size-2);
*buffer = SC_OK;
break;
default:
#if LANG_ENG
printf (" Error in console application.\n\r");
#elif LANG_RUS
printf (" Îøèáêà â êîíñîëüíîì ïðèëîæåíèè.\n\r");
#endif
return 0;
};
if (is_end)
{
printf("\n\r");
return 1;
}
}
return 9;
}

View File

@ -0,0 +1,8 @@
#define SC_OK 0
#define SC_EXIT 1
#define SC_PUTC 2
#define SC_PUTS 3
#define SC_GETC 4
#define SC_GETS 5
#define SC_CLS 6

View File

@ -215,14 +215,13 @@ while (*(s+i))
void kol_board_puti(int n) void kol_board_puti(int n)
{ {
char c; char c;
int i = 0;
do if ( n > 1 )
{ kol_board_puti(n / 10);
c = n % 10 + '0';
asm ("int $0x40"::"a"(63), "b"(1), "c"(c)); c = n % 10 + '0';
i++; asm ("int $0x40"::"a"(63), "b"(1), "c"(c));
}
while ((n /= 10) > 0);
} }
@ -420,3 +419,16 @@ void kol_get_kernel_ver(char buff16b[])
{ {
asm ("int $0x40"::"a"(18), "b"(13), "c"(buff16b)); asm ("int $0x40"::"a"(18), "b"(13), "c"(buff16b));
} }
int kol_buffer_open(char name[], int mode, int size, char **buf)
{
int error;
asm ("movl %0, %%esi"::"r"(mode));
asm ("int $0x40":"=a"(*buf), "=d"(error):"a"(68), "b"(22), "c"(name), "d"(size));
return error;
}
void kol_buffer_close(char name[])
{
asm ("int $0x40"::"a"(68), "b"(23), "c"(name));
}

View File

@ -1,6 +1,18 @@
#define NULL ((void*)0) #define NULL ((void*)0)
#define SHM_OPEN 0
#define SHM_OPEN_ALWAYS 0x04
#define SHM_CREATE 0x08
#define SHM_READ 0x00
#define SHM_WRITE 0x01
#define E_NOTFOUND 5
#define E_ACCESS 10
#define E_NOMEM 30
#define E_PARAM 33
typedef struct typedef struct
{ {
unsigned p00 __attribute__((packed)); unsigned p00 __attribute__((packed));
@ -90,3 +102,5 @@ unsigned kol_process_info(unsigned slot, char buf1k[]);
int kol_process_kill_pid(unsigned process); int kol_process_kill_pid(unsigned process);
void kol_get_kernel_ver(char buff16b[]); void kol_get_kernel_ver(char buff16b[]);
int kol_kill_process(unsigned process); int kol_kill_process(unsigned process);
int kol_buffer_open(char name[], int mode, int size, char **buf);
void kol_buffer_close(char name[]);

View File

@ -122,3 +122,19 @@ char* strchr(const char* string, int c)
return (char*)0; return (char*)0;
} }
void _itoa(int i, char *s)
{
int a, b, c, d;
a = (i - i%1000)/1000;
b = (i - i%100)/100 - a*10;
c = (i - i%10)/10 - a*100 - b*10;
d = i%10;
s[0] = a + '0';
s[1] = b + '0';
s[2] = c + '0';
s[3] = d + '0';
s[4] = 0;
}

View File

@ -13,3 +13,4 @@ void strcpy(char strDest[], const char strSource[]);
char* strncpy(char *strDest, const char *strSource, unsigned n); char* strncpy(char *strDest, const char *strSource, unsigned n);
int strlen(const char* string); int strlen(const char* string);
char *strchr(const char* string, int c); char *strchr(const char* string, int c);
void _itoa(int i, char *s);

View File

@ -0,0 +1,109 @@
#include "system/kolibri.h"
#include "system/string.h"
#include "program_console.h"
char *buffer; // èñïîëüçóåòñÿ òîëüêî îäíà èìåíîâàííàÿ îáëàñòü, ïîýòîìó ìîæíî ñäåëàòü å¸ ãëîáàëüíîé ïåðåìåííîé
char name[32]; // èìÿ íóæíî êàê äëÿ ñîçäàíèÿ îáëàñòè, òàê è äëÿ óäàëåíèÿ, ïîýòîìó ìîæíî ñäåëàòü å¸ ãëîáàëüíîé ïåðåìåííîé
int sc_init() // èíèöèàëèçàöèÿ - ñîçäàíèå èìåíîâàííîé îáëàñòè
{
char *buf1k;
unsigned PID;
int result;
buf1k = malloc(1024);
if (NULL == buf1k)
return -1;
kol_process_info(-1, buf1k); // ïîëó÷àåì ÑÂÎÉ (-1) èäåíòèôèêàòîð ïðîöåññà
PID = *(buf1k+30);
free(buf1k);
_itoa(PID, name); // ôîðìèðóåì èç íîìåðà ïðîöåññà ñòðîêó ñ çàãëàâíûìè íóëÿìè 42 -> 0042 (ò.å. äî 9999)
strcat(name, "-SHELL");
*buffer = NULL;
result = kol_buffer_open(name, SHM_OPEN_ALWAYS | SHM_WRITE, 1024*16, &buffer); // ñîçäà¸ì îáëàñòü (16 êèë)
return result;
}
void sc_puts(char *str)
{
*buffer = SC_PUTS;
strcpy(buffer+1, str);
while (*buffer) kol_sleep(5);
}
void sc_exit()
{
*buffer = SC_EXIT;
while (*buffer) kol_sleep(5);
kol_buffer_close(name);
}
void sc_gets(char *str)
{
*buffer = SC_GETS;
while (*buffer) kol_sleep(5);
strcpy(str, buffer+1);
}
char sc_getc()
{
*buffer = SC_GETC;
while (*buffer) kol_sleep(5);
return *(buffer+1);
}
void sc_putc(char c)
{
*buffer = SC_PUTC;
*(buffer+1) = c;
while (*buffer) kol_sleep(5);
}
void sc_cls()
{
*buffer = SC_CLS;
while (*buffer) kol_sleep(5);
}
void kol_main()
{
char string[256];
sc_init();
sc_cls();
sc_puts("This is a test console application for Shell\n\r");
sc_puts("Type a string (255 symbols max): ");
sc_gets(string);
sc_puts("You typed:\n\r");
sc_puts(string);
sc_puts("Press any key: ");
string[0] = sc_getc();
sc_puts("\n\rYou pressed: ");
sc_putc(string[0]);
sc_exit();
}