waitfor command

git-svn-id: svn://kolibrios.org@6825 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
siemargl 2017-01-06 16:12:57 +00:00
parent 61afff5eba
commit 0dd49af34c
13 changed files with 139 additions and 28 deletions

View File

@ -39,13 +39,16 @@ date
echo Выводит <данные> на экран
exit завершение работы Shell
free показывает объём оперативной памяти: всей, свободной и используемой
help показать печень команд shell. С параметром <команда> справка по команде
help показать перечень команд shell. С параметром <команда> справка по команде
history cписок последних использованных команд
kill убивает процесс по <PID>. kill all убивает все пользовательские процессы PID >=2
kill убивает процесс по <PID>. 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
или до завершения явно указанного параметра <PID>
Скрипты и запуск на исполнение
=======================================
Если имя исполнимого файла начинается с / то считается что путь является абсолютным.
В противном случае, поиск сначала проводится в текущем каталоге, а затем в /rd/1.
Далее, если файл найден, проверяются первые 4 байта на сигнатуру #SHS.
С этой сигнатуры начинается командный (пакетный) файл.
В командном файле допустимы все команды приведенные выше, а комментарии
начинаются с символа # в первой позиции строки.
Если на выполнение был задан исполняемый файл, запомнит LASTPID

View File

@ -1,5 +1,6 @@
Shell 0.7.5 // 01.01.2017 // Siemargl
Shell 0.7.5 // 06.01.2017 // Siemargl
* <20>¥«×¨¥ ¡ £ה¨×בכ, ¨§¬¥­¥­  «®£¨×  ®¡א ¡®גר בגא¥«®× ¢¢¥או/¢­¨§, חג®¡כ × × ד ¢ב¥ו
„®¡ ¢«¥­  ª®¬ ­¤  waitfor ¨ ¢ à¨ ­â ps á ¯ à ¬¥â஬
Shell 0.7.4 // 23.01.2014 // Albom
* <20> ¡®ג  ב ¡דה¥א®¬ ®¡¬¥­  (×®¯¨א®¢ ­¨¥ Ctrl+C ¨ ¢בג ¢×  Ctrl+V בגא®×¨ ז¥«¨×®¬)

View File

@ -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"

View File

@ -1,5 +1,6 @@
#SHS
about
echo
ver kernel
echo
echo Type 'help' for help
echo

View File

@ -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)
{
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;
}

View File

@ -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;
}

View File

@ -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[]);
/// ===========================================================

View File

@ -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 <directory> ;lists the files at specified folder\n\r", &cmd_ls},
{"mkdir", " Makes directory. Usage:\n\r mkdir <folder name> ;creates the folder in working directory\n\r mkdir <path><folder name> ;create folder by specified path\n\r", &cmd_mkdir},
{"more", " Displays a file data to the screen. Usage:\n\r more <file name>\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 <procname> 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 <file name>\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 <PID>;awaiting PID finish\n\r", &cmd_waitfor},
};

View File

@ -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", " <20>®ª §ë¢ ¥â ¨¬ï ⥪ã饩 ¤¨à¥ªâ®à¨¨\n\r", &cmd_pwd},
{"reboot", " <20>¥à¥§ £à㦠¥â ª®¬¯ìîâ¥à ¨«¨ ï¤à® KolibriOS. ˆá¯®«ì§®¢ ­¨¥:\n\r reboot ;¯¥à¥§ £à㧨âì <20>Š\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", " <20>®ª §ë¢ ¥â uptime\n\r", &cmd_uptime},
{"ver", " <20>®ª §ë¢ ¥â ¢¥àá¨î. ˆá¯®«ì§®¢ ­¨¥:\n\r ver ;¢¥àá¨ï Shell\n\r ver kernel ;¢¥àá¨ï ¨ ­®¬¥à ॢ¨§¨¨ ï¤à  KolibriOS\n\r ver cpu ;¨­ä®à¬ æ¨ï ® ¯à®æ¥áá®à¥\n\r", &cmd_ver},
{"waitfor", " <20>ਮáâ ­ ¢«¨¢ ¥â ¢ë¯®«­¥­¨¥ ª®¬ ­¤. ˆá¯®«ì§®¢ ­¨¥:\n\r waitfor ;®¦¨¤ ¥¬ ¯à¥¤ë¤ã騩 § ¯ã饭­ë© ¯à®æ¥áá LASTPID\n\r waitfor <PID>;¦¤¥¬ § ¢¥à襭¨ï ¯à®æ¥áá  á 㪠§ ­­ë¬ PID\n\r", &cmd_waitfor},
};

View File

@ -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;
}

View File

@ -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

View File

@ -70,6 +70,24 @@ string2++;
}
int strnicmp(const char* string1, const char* string2, unsigned count)
{
int pc = 0;
while (1)
{
if (toupper(*string1)<toupper(*string2))
return -1;
if (toupper(*string1)>toupper(*string2))
return 1;
if (*string1=='\0' || pc == count)
return 0;
string1++;
string2++;
pc++;
}
}
void strcpy(char strDest[], const char strSource[])
{

View File

@ -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);