From 0dd49af34c74c9b0fb9ca31205a2d8712b3063da Mon Sep 17 00:00:00 2001 From: siemargl Date: Fri, 6 Jan 2017 16:12:57 +0000 Subject: [PATCH] waitfor command git-svn-id: svn://kolibrios.org@6825 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/system/shell/Docs_rus.txt | 30 +++++++++-- programs/system/shell/History.txt | 3 +- programs/system/shell/all.h | 1 + programs/system/shell/bin/eng/.shell | 7 +-- programs/system/shell/cmd/cmd_ps.c | 19 +++++-- programs/system/shell/cmd/cmd_waitfor.c | 52 +++++++++++++++++++ programs/system/shell/globals.h | 3 +- programs/system/shell/locale/eng/globals.h | 3 +- programs/system/shell/locale/rus/globals.h | 3 +- .../system/shell/modules/module_command.c | 4 +- .../system/shell/modules/module_executable.c | 1 + programs/system/shell/system/string.c | 40 ++++++++++---- programs/system/shell/system/string.h | 1 + 13 files changed, 139 insertions(+), 28 deletions(-) create mode 100644 programs/system/shell/cmd/cmd_waitfor.c diff --git a/programs/system/shell/Docs_rus.txt b/programs/system/shell/Docs_rus.txt index 47a1578ba2..6555a93a9c 100644 --- a/programs/system/shell/Docs_rus.txt +++ b/programs/system/shell/Docs_rus.txt @@ -39,13 +39,16 @@ date echo Выводит <данные> на экран exit завершение работы Shell free показывает объём оперативной памяти: всей, свободной и используемой -help показать печень команд shell. С параметром <команда> справка по команде +help показать перечень команд shell. С параметром <команда> справка по команде history cписок последних использованных команд -kill убивает процесс по . kill all убивает все пользовательские процессы PID >=2 +kill убивает процесс по . kill all убивает все процессы, слоты >=2 ls выводит список файлов в текущем каталоге или указанном <каталоге> mkdir cоздает <каталог>. Поддерживаются абсолюные и относительные пути more выводит содержимое <файла> на экран -ps показывает список процессов и их PID +ps показывает список процессов и их PID, + если задать <имя>, покажет %CPU, используемую память и запомнит + внутреннюю переменную LASTPID (полезно для команды waitfor) + <имя> - это первые 10 букв имени исполняемого файла без расширения pwd показывает имя текущего каталога reboot перезагружает компьютер или ядро KolibriOS. reboot kernel перезапустить ядро Kolibri rm удаляет <файл> @@ -53,5 +56,22 @@ rmdir shutdown выключает компьютер sleep приостанавливает работу Shell'а на заданное <время в сотых долях секунды> touch создаёт пустой <файл> или изменяет дату/время создания файла. Не работает -uptime показывает время работу системы с момента загрузки -ver показывает версию Shell, ver kernel - версию и номер ревизии ядра OS, ver cpu - информацию о процессоре +uptime показывает время работы системы с момента загрузки +ver показывает версию Shell, ver kernel - версию и номер ревизии ядра OS, + ver cpu - информацию о процессоре +waitfor если перед этим была запущена программа, приостанавливает + выполнение командного файла до ее завершения по LASTPID + или до завершения явно указанного параметра + +Скрипты и запуск на исполнение +======================================= +Если имя исполнимого файла начинается с / то считается что путь является абсолютным. +В противном случае, поиск сначала проводится в текущем каталоге, а затем в /rd/1. + +Далее, если файл найден, проверяются первые 4 байта на сигнатуру #SHS. +С этой сигнатуры начинается командный (пакетный) файл. +В командном файле допустимы все команды приведенные выше, а комментарии +начинаются с символа # в первой позиции строки. + +Если на выполнение был задан исполняемый файл, запомнит LASTPID + diff --git a/programs/system/shell/History.txt b/programs/system/shell/History.txt index 7aa0052184..507651c77d 100644 --- a/programs/system/shell/History.txt +++ b/programs/system/shell/History.txt @@ -1,5 +1,6 @@ -Shell 0.7.5 // 01.01.2017 // Siemargl +Shell 0.7.5 // 06.01.2017 // Siemargl * ЊҐ«ЄЁҐ Ў ЈдЁЄбл, Ё§¬Ґ­Ґ­  «®ЈЁЄ  ®Ўа Ў®вЄЁ бв५®Є ўўҐае/ў­Ё§, зв®Ўл Є Є г ўбҐе + „®Ў ў«Ґ­  Є®¬ ­¤  waitfor Ё ў аЁ ­в ps б Ї а ¬Ґв஬ Shell 0.7.4 // 23.01.2014 // Albom * ђ Ў®в  б ЎгдҐа®¬ ®Ў¬Ґ­  (Є®ЇЁа®ў ­ЁҐ Ctrl+C Ё ўбв ўЄ  Ctrl+V бва®ЄЁ 楫ЁЄ®¬) diff --git a/programs/system/shell/all.h b/programs/system/shell/all.h index c371a37c7a..145b85ab08 100644 --- a/programs/system/shell/all.h +++ b/programs/system/shell/all.h @@ -42,6 +42,7 @@ #include "cmd/cmd_uptime.c" #include "cmd/cmd_history.c" #include "cmd/cmd_cp.c" +#include "cmd/cmd_waitfor.c" #include "modules/module_command.c" #include "modules/module_program_console.c" diff --git a/programs/system/shell/bin/eng/.shell b/programs/system/shell/bin/eng/.shell index c65fcb04e5..6cdceebe64 100644 --- a/programs/system/shell/bin/eng/.shell +++ b/programs/system/shell/bin/eng/.shell @@ -1,5 +1,6 @@ #SHS - -about -echo Type 'help' for help +echo +ver kernel +echo +echo Type 'help' for help echo diff --git a/programs/system/shell/cmd/cmd_ps.c b/programs/system/shell/cmd/cmd_ps.c index 04041e1ba3..65e8b334bd 100644 --- a/programs/system/shell/cmd/cmd_ps.c +++ b/programs/system/shell/cmd/cmd_ps.c @@ -2,7 +2,7 @@ int cmd_ps(char param[]) { -int i, n; +int i, n, sel; char *buf1k; unsigned PID; short STATE; @@ -11,13 +11,26 @@ buf1k = malloc(1024); if (NULL == buf1k) return FALSE; +sel = param && strlen(param) > 0; + for (i = 1;;i++) { n = kol_process_info(i, buf1k); PID = *(buf1k+30); STATE = *(buf1k+50); - if ( 9 != STATE) - printf (" %7d %s\n\r", PID, buf1k+10); + if (9 != STATE) + { + if (!sel || 0 == strnicmp(param, buf1k+10, 10)) + { + printf (" %7d %s\n\r", PID, buf1k+10); + if (sel) + { + LAST_PID = PID; + int cpu_tck = kol_system_cpufreq() / 100; + printf (" CPU %d%% RAM %d\n\r", *(int*)buf1k / cpu_tck , *(int*)(buf1k+26)+1); + } + } + } if (i == n) break; } diff --git a/programs/system/shell/cmd/cmd_waitfor.c b/programs/system/shell/cmd/cmd_waitfor.c new file mode 100644 index 0000000000..670982cc18 --- /dev/null +++ b/programs/system/shell/cmd/cmd_waitfor.c @@ -0,0 +1,52 @@ + +int cmd_waitfor(char param[]) +// waits for LASTPID or pid in param +{ + +int i, n, sel, sel_pid; +char *buf1k; +unsigned PID; +short STATE; + +sel = param && strlen(param) > 0; +sel_pid = LAST_PID; +if (sel) + { + sel_pid = _atoi(param); + } +if (0 == sel_pid) + return FALSE; + + #if LANG_ENG + printf(" Awaing finish PID %d\n\r", sel_pid); + #elif LANG_RUS + printf(" Ћ¦Ё¤ Ґ¬ § ўҐа襭Ёп PID %d\n\r", sel_pid); + #endif + +buf1k = malloc(1024); +if (NULL == buf1k) + return FALSE; + +while(1) + { + for (i = 1;;i++) + { + n = kol_process_info(i, buf1k); + PID = *(buf1k+30); + STATE = *(buf1k+50); + if (PID == sel_pid) + if(9 == STATE) + goto exit_normal; + else break; + if (i == n) + goto exit_normal; + } + kol_sleep(10); // 100ms + } + +exit_normal: +free(buf1k); +return TRUE; + +} + diff --git a/programs/system/shell/globals.h b/programs/system/shell/globals.h index 177ace9d41..c5f2873da7 100644 --- a/programs/system/shell/globals.h +++ b/programs/system/shell/globals.h @@ -20,6 +20,7 @@ char CMD[256]; char CMD_HISTORY[CMD_HISTORY_NUM][256]; char CMD_NUM = 0; char CMD_HISTORY_NUM_REAL = 0; +unsigned LAST_PID = 0; /// =========================================================== @@ -66,7 +67,7 @@ int cmd_uptime(char param[]); int cmd_killall(char process_name[]); int cmd_history(char arg[]); int cmd_cp(char param[]); - +int cmd_waitfor(char param[]); /// =========================================================== diff --git a/programs/system/shell/locale/eng/globals.h b/programs/system/shell/locale/eng/globals.h index ae4ed461bf..faf04e0368 100644 --- a/programs/system/shell/locale/eng/globals.h +++ b/programs/system/shell/locale/eng/globals.h @@ -16,7 +16,7 @@ const command_t COMMANDS[]= {"ls", " Lists the files in a directory. Usage:\n\r ls ;lists the files in current directory\n\r ls ;lists the files at specified folder\n\r", &cmd_ls}, {"mkdir", " Makes directory. Usage:\n\r mkdir ;creates the folder in working directory\n\r mkdir ;create folder by specified path\n\r", &cmd_mkdir}, {"more", " Displays a file data to the screen. Usage:\n\r more \n\r", &cmd_more}, - {"ps", " Lists the current processes running\n\r", &cmd_ps}, + {"ps", " Lists the current processes running\n\r or shows more info on and save LASTPID\n\r", &cmd_ps}, {"pwd", " Displays the name of the working directory\n\r", &cmd_pwd}, {"reboot", " Reboots the computer or KolibriOS kernel. Usage:\n\r reboot ;reboot a PC\n\r reboot kernel ;reboot the KolibriOS kernel\n\r", &cmd_reboot}, {"rm", " Removes a file. Usage:\n\r rm file name>\n\r", &cmd_rm}, @@ -26,5 +26,6 @@ const command_t COMMANDS[]= {"touch", " Creates an empty file or updates the time/date stamp on a file. Usage:\n\r touch \n\r", &cmd_touch}, {"uptime", " Displays the uptime\n\r", &cmd_uptime}, {"ver", " Displays version. Usage:\n\r ver ;Shell version\n\r ver kernel ;version of KolibriOS kernel\n\r ver cpu ;information about CPU\n\r", &cmd_ver}, + {"waitfor", " Stops console waiting while process finish. Usage:\n\r waitfor ;waiting previous started executable LASTPID\n\r waitfor ;awaiting PID finish\n\r", &cmd_waitfor}, }; diff --git a/programs/system/shell/locale/rus/globals.h b/programs/system/shell/locale/rus/globals.h index 1e8e8da100..26c16f98e1 100644 --- a/programs/system/shell/locale/rus/globals.h +++ b/programs/system/shell/locale/rus/globals.h @@ -16,7 +16,7 @@ const command_t COMMANDS[]= {"ls", " ‚лў®¤Ёв бЇЁб®Є д ©«®ў. €бЇ®«м§®ў ­ЁҐ:\n\r ls ;бЇЁб®Є д ©«®ў ў ⥪г饬 Є в «®ЈҐ\n\r ls <¤ЁаҐЄв®аЁп> ;бЇЁб®Є д ©«®ў Ё§ § ¤ ­­®© ¤ЁаҐЄв®аЁЁ\n\r", &cmd_ls}, {"mkdir", " ‘®§¤ Ґв Є в «®Ј. €бЇ®«м§®ў ­ЁҐ:\n\r mkdir <Ё¬п Ї ЇЄЁ> ;ᮧ¤ вм Ї ЇЄг ў ⥪г饬 Є в «®ЈҐ\n\r mkdir <Їгвм><Ё¬п Ї ЇЄЁ> ;ᮧ¤ вм Ї ЇЄг Ї® гЄ § ­­®¬г ЇгвЁ\n\r", &cmd_mkdir}, {"more", " ‚лў®¤Ёв ᮤҐа¦Ё¬®Ґ д ©«  ­  нЄа ­. €бЇ®«м§®ў ­ЁҐ:\n\r more <Ё¬п д ©« >\n\r", &cmd_more}, - {"ps", " ‚лў®¤Ёв бЇЁб®Є Їа®жҐбб®ў\n\r", &cmd_ps}, + {"ps", " ‚лў®¤Ёв бЇЁб®Є Їа®жҐбб®ў\n\r …б«Ё гЄ § ­® <Ё¬пЇа®жҐбб >, Ї®Є §лў Ґв Ў®«миҐ ¤ ­­ле Ё б®еа ­пҐв LASTPID\n\r", &cmd_ps}, {"pwd", " Џ®Є §лў Ґв Ё¬п ⥪г饩 ¤ЁаҐЄв®аЁЁ\n\r", &cmd_pwd}, {"reboot", " ЏҐаҐ§ Јаг¦ Ґв Є®¬ЇмовҐа Ё«Ё п¤а® KolibriOS. €бЇ®«м§®ў ­ЁҐ:\n\r reboot ;ЇҐаҐ§ Јаг§Ёвм ЏЉ\n\r reboot kernel ;ЇҐаҐ§ ЇгбвЁвм п¤а® Kolibri\n\r", &cmd_reboot}, {"rm", " “¤ «пҐв д ©«. €бЇ®«м§®ў ­ЁҐ:\n\r rm <Ё¬п д ©« >\n\r", &cmd_rm}, @@ -26,5 +26,6 @@ const command_t COMMANDS[]= {"touch", " ‘®§¤ св Їгбв®© д ©« Ё«Ё Ё§¬Ґ­пҐв ¤ вг/ўаҐ¬п ᮧ¤ ­Ёп д ©« . €бЇ®«м§®ў ­ЁҐ:\n\r touch <Ё¬п д ©« >\n\r", &cmd_touch}, {"uptime", " Џ®Є §лў Ґв uptime\n\r", &cmd_uptime}, {"ver", " Џ®Є §лў Ґв ўҐабЁо. €бЇ®«м§®ў ­ЁҐ:\n\r ver ;ўҐабЁп Shell\n\r ver kernel ;ўҐабЁп Ё ­®¬Ґа ॢЁ§ЁЁ п¤а  KolibriOS\n\r ver cpu ;Ё­д®а¬ жЁп ® Їа®жҐбб®аҐ\n\r", &cmd_ver}, + {"waitfor", " ЏаЁ®бв ­ ў«Ёў Ґв ўлЇ®«­Ґ­ЁҐ Є®¬ ­¤. €бЇ®«м§®ў ­ЁҐ:\n\r waitfor ;®¦Ё¤ Ґ¬ ЇаҐ¤л¤гйЁ© § Їг饭­л© Їа®жҐбб LASTPID\n\r waitfor ;¦¤Ґ¬ § ўҐа襭Ёп Їа®жҐбб  б гЄ § ­­л¬ PID\n\r", &cmd_waitfor}, }; diff --git a/programs/system/shell/modules/module_command.c b/programs/system/shell/modules/module_command.c index f687e43d9e..e9eabdca1f 100644 --- a/programs/system/shell/modules/module_command.c +++ b/programs/system/shell/modules/module_command.c @@ -8,6 +8,8 @@ int i; if ('\0' == CMD[0]) return; +CMD_NUM = -1; + for (i = 0; i < CMD_HISTORY_NUM_REAL; i++) if ( 0 == strcmp( CMD_HISTORY[i], CMD ) ) return; @@ -20,8 +22,6 @@ strcpy(CMD_HISTORY[0], CMD); if (CMD_HISTORY_NUM_REAL < CMD_HISTORY_NUM-1) CMD_HISTORY_NUM_REAL++; -CMD_NUM = -1; - } diff --git a/programs/system/shell/modules/module_executable.c b/programs/system/shell/modules/module_executable.c index e20ea05315..92befda711 100644 --- a/programs/system/shell/modules/module_executable.c +++ b/programs/system/shell/modules/module_executable.c @@ -48,6 +48,7 @@ if (result > 0) if ( !program_console(result) ) { + LAST_PID = result; #if LANG_ENG printf (" '%s' started. PID = %d\n\r", cmd, result); #elif LANG_RUS diff --git a/programs/system/shell/system/string.c b/programs/system/shell/system/string.c index 5fc16576e3..dd8d598009 100644 --- a/programs/system/shell/system/string.c +++ b/programs/system/shell/system/string.c @@ -55,22 +55,40 @@ int strcmp(const char* string1, const char* string2) { while (1) + { + if (*string1<*string2) + return -1; + if (*string1>*string2) + return 1; + + if (*string1=='\0') + return 0; + + string1++; + string2++; + } + +} + +int strnicmp(const char* string1, const char* string2, unsigned count) { -if (*string1<*string2) - return -1; -if (*string1>*string2) - return 1; +int pc = 0; +while (1) + { + if (toupper(*string1)toupper(*string2)) + return 1; -if (*string1=='\0') - return 0; + if (*string1=='\0' || pc == count) + return 0; -string1++; -string2++; + string1++; + string2++; + pc++; + } } -} - - void strcpy(char strDest[], const char strSource[]) { unsigned i; diff --git a/programs/system/shell/system/string.h b/programs/system/shell/system/string.h index 2ca5916ef9..7043a4d4bb 100644 --- a/programs/system/shell/system/string.h +++ b/programs/system/shell/system/string.h @@ -18,3 +18,4 @@ void _itoa(int i, char *s); void reverse(char *s); void itoa(int i, char *s); int _atoi( char *s ); +int strnicmp(const char* string1, const char* string2, unsigned count);