#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int lsh_launch( char ** args)
{
pid_t pid, wpid;
int status;
pid = fork( ) ;
if ( pid == 0 )
{
//принимаем имя и массив аргументов
if ( execvp( args[ 0 ] , args) == - 1 )
{ //первое слово массива определяем как команду, остальные аргументы
perror ( "lsh" ) ; //abcd-команда. fddeh,egf-аргументы }
} else if ( pid < 0 )
{
// ошибка в создании
} else
{
do
{ //ну а если все хорошо, то ждем ее завершения
wpid = waitpid( pid, & status, WUNTRACED) ;
}
while ( ! WIFEXITED( status) && ! WIFSIGNALED( status) ) ;
}
return 1 ;
}
int lsh_execute( char ** args)
{
return lsh_launch( args) ;
}
#define LSH_RL_BUFSIZE 1024
char * lsh_read_line( )
{
int bufsize = LSH_RL_BUFSIZE;
int position = 0 ;
char * buffer
= malloc ( sizeof ( char ) * bufsize
) ; char c;
if ( ! buffer)
{
fprintf ( stderr
, "lsh: Ошибка памяти\n " ) ; }
while ( ( ( c
= getchar ( ) ) != EOF
) || ( c
!= '\n ' ) ) {
//при EOF или \n обнуляем буффер и возвращаем его значение
buffer[ position] = c;
position++; //должны ввести с ввода и заполнить массив
printf ( "%s" , buffer
) ; //то есть получаем строку abcd fddeh egf if ( position >= bufsize)
{
bufsize += LSH_RL_BUFSIZE;
buffer
= realloc ( buffer
, bufsize
) ; //расширяем если не хватило if ( ! buffer)
{
fprintf ( stderr
, "lsh: Ошибка памяти\n " ) ; }
}
}
buffer[ position] = '\0 ' ;
return buffer;
}
#define LSH_TOK_BUFSIZE 100
char ** lsh_split_line( char * line)
{
int bufsize0 = LSH_TOK_BUFSIZE;
int bufsize = LSH_TOK_BUFSIZE, position = 0 ;
char ** tokens
= malloc ( bufsize
* sizeof ( char * ) ) ; int flag = 0 ; //определение кавычек
int pos = 0 ;
char ch = 0 ;
while ( ( ch!= EOF) || ( ch!= '\n ' ) ) //приравнием ch строку посимвольно
{
ch = line[ pos] ;
if ( ( ch== '\" ' ) && ( flag== 1 ) ) flag = 0 ; //дожен выйти массив tokens[0]=abcd; tokens[1]=fddeh; tokens[2]=egf
if ( ( ch== '\" ' ) && ( flag== 0 ) ) flag = 1 ;
if ( ( ch!= ' ' ) || ( ( ch== ' ' ) && ( flag = 1 ) ) )
{
tokens[ position] [ pos] = ch;
pos++;
}
else
{
printf ( "%s" , tokens
[ position
] ) ; position++;
}
if ( position >= bufsize) { //расширяем если не хватило строк или пасяти для строк то выделяем
bufsize += LSH_TOK_BUFSIZE;
tokens
= realloc ( tokens
, bufsize
* sizeof ( char * ) ) ; if ( ! tokens) {
fprintf ( stderr
, "lsh: Ошибка памяти\n " ) ; }
}
if ( pos >= bufsize0)
{
bufsize0 += LSH_TOK_BUFSIZE;
tokens
[ position
] = realloc ( tokens
[ position
] , bufsize0
* sizeof ( char * ) ) ; if ( ! tokens)
{
fprintf ( stderr
, "lsh: Ошибка памяти\n " ) ; }
}
}
tokens[ position] = NULL;
return tokens;
}
void lsh_loop( void )
{
char * line;
char ** args;
int status;
do
{
line = lsh_read_line( ) ; //функция чтения входной строки
args = lsh_split_line( line) ; //разбиение
status = lsh_execute( args) ; //выполнение
} while ( status) ;
}
int main( int argc, char ** argv)
{
//загрузка файлов если они есть и запуск команд
lsh_loop( ) ;
return EXIT_SUCCESS;
}
I2luY2x1ZGUgPHN5cy93YWl0Lmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKaW50IGxzaF9sYXVuY2goY2hhciAqKmFyZ3MpCnsKICBwaWRfdCBwaWQsIHdwaWQ7CiAgaW50IHN0YXR1czsKICBwaWQgPSBmb3JrKCk7CiAgaWYgKHBpZCA9PSAwKQogIHsKICAgIC8v0L/RgNC40L3QuNC80LDQtdC8INC40LzRjyDQuCDQvNCw0YHRgdC40LIg0LDRgNCz0YPQvNC10L3RgtC+0LIKICAgIGlmIChleGVjdnAoYXJnc1swXSwgYXJncykgPT0gLTEpCiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v0L/QtdGA0LLQvtC1INGB0LvQvtCy0L4g0LzQsNGB0YHQuNCy0LAg0L7Qv9GA0LXQtNC10LvRj9C10Lwg0LrQsNC6INC60L7QvNCw0L3QtNGDLCDQvtGB0YLQsNC70YzQvdGL0LUg0LDRgNCz0YPQvNC10L3RgtGLCiAgICAgIHBlcnJvcigibHNoIik7ICAgICAgICAgICAgICAgICAgICAgIC8vYWJjZC3QutC+0LzQsNC90LTQsC4gZmRkZWgsZWdmLdCw0YDQs9GD0LzQtdC90YLRiwogICAgfQogICAgZXhpdChFWElUX0ZBSUxVUkUpOwogIH0gZWxzZSBpZiAocGlkIDwgMCkKICB7CiAgICAvLyDQvtGI0LjQsdC60LAg0LIg0YHQvtC30LTQsNC90LjQuAogICAgcGVycm9yKCJsc2giKTsKICB9IGVsc2UKICB7CiAgICBkbwogICAgeyAgICAgIC8v0L3RgyDQsCDQtdGB0LvQuCDQstGB0LUg0YXQvtGA0L7RiNC+LCDRgtC+INC20LTQtdC8INC10LUg0LfQsNCy0LXRgNGI0LXQvdC40Y8KICAgICAgd3BpZCA9IHdhaXRwaWQocGlkLCAmc3RhdHVzLCBXVU5UUkFDRUQpOwogICAgfQogICAgd2hpbGUgKCFXSUZFWElURUQoc3RhdHVzKSAmJiAhV0lGU0lHTkFMRUQoc3RhdHVzKSk7CiAgfQogIHJldHVybiAxOwp9CgppbnQgbHNoX2V4ZWN1dGUoY2hhciAqKmFyZ3MpCnsKICByZXR1cm4gbHNoX2xhdW5jaChhcmdzKTsKfQoKI2RlZmluZSBMU0hfUkxfQlVGU0laRSAxMDI0CmNoYXIgKmxzaF9yZWFkX2xpbmUoKQp7CiAgaW50IGJ1ZnNpemUgPSBMU0hfUkxfQlVGU0laRTsKICBpbnQgcG9zaXRpb24gPSAwOwogIGNoYXIgKmJ1ZmZlciA9IG1hbGxvYyhzaXplb2YoY2hhcikgKiBidWZzaXplKTsKICBjaGFyIGM7CiAgaWYgKCFidWZmZXIpCiAgewogICAgZnByaW50ZihzdGRlcnIsICJsc2g6INCe0YjQuNCx0LrQsCDQv9Cw0LzRj9GC0LhcbiIpOwogICAgZXhpdChFWElUX0ZBSUxVUkUpOwogIH0KICB3aGlsZSAoKChjPWdldGNoYXIoKSkhPUVPRil8fChjIT0nXG4nKSkKICB7CiAgICAvL9C/0YDQuCBFT0Yg0LjQu9C4IFxuINC+0LHQvdGD0LvRj9C10Lwg0LHRg9GE0YTQtdGAINC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdC8INC10LPQviDQt9C90LDRh9C10L3QuNC1CiAgICAgIGJ1ZmZlcltwb3NpdGlvbl0gPSBjOwogICAgICBwb3NpdGlvbisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/QtNC+0LvQttC90Ysg0LLQstC10YHRgtC4INGBINCy0LLQvtC00LAg0Lgg0LfQsNC/0L7Qu9C90LjRgtGMINC80LDRgdGB0LjQsgogICAgICBwcmludGYoIiVzIixidWZmZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL9GC0L4g0LXRgdGC0Ywg0L/QvtC70YPRh9Cw0LXQvCDRgdGC0YDQvtC60YMgYWJjZCBmZGRlaCBlZ2YKICAgICAgaWYgKHBvc2l0aW9uID49IGJ1ZnNpemUpCiAgICAgIHsKICAgICAgICBidWZzaXplICs9IExTSF9STF9CVUZTSVpFOwogICAgICAgIGJ1ZmZlciA9IHJlYWxsb2MoYnVmZmVyLCBidWZzaXplKTsgICAgICAgICAgLy/RgNCw0YHRiNC40YDRj9C10Lwg0LXRgdC70Lgg0L3QtSDRhdCy0LDRgtC40LvQvgogICAgICAgIGlmICghYnVmZmVyKQogICAgICAgIHsKICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibHNoOiDQntGI0LjQsdC60LAg0L/QsNC80Y/RgtC4XG4iKTsKICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKICAgICAgICB9CiAgICAgIH0KICB9CiAgYnVmZmVyW3Bvc2l0aW9uXSA9ICdcMCc7CiAgcHJpbnRmKCIlcyIsYnVmZmVyKTsKICByZXR1cm4gYnVmZmVyOwp9CgojZGVmaW5lIExTSF9UT0tfQlVGU0laRSAxMDAKY2hhciAqKmxzaF9zcGxpdF9saW5lKGNoYXIgKmxpbmUpCnsKICBwcmludGYoIiVkIiwxKTsKICBpbnQgYnVmc2l6ZTAgPSBMU0hfVE9LX0JVRlNJWkU7CiAgaW50IGJ1ZnNpemUgPSBMU0hfVE9LX0JVRlNJWkUsIHBvc2l0aW9uID0gMDsKICBjaGFyICoqdG9rZW5zID0gbWFsbG9jKGJ1ZnNpemUgKiBzaXplb2YoY2hhciopKTsKICBpbnQgZmxhZyA9IDA7Ly/QvtC/0YDQtdC00LXQu9C10L3QuNC1INC60LDQstGL0YfQtdC6CiAgaW50IHBvcyA9IDA7CiAgY2hhciBjaCA9IDA7CiAgcHJpbnRmKCLQkCDRgtGD0YIgbGluZSVzIixsaW5lKTsKICB3aGlsZSAoKGNoIT1FT0YpfHwoY2ghPSdcbicpKSAgICAgICAgIC8v0L/RgNC40YDQsNCy0L3QuNC10LwgY2gg0YHRgtGA0L7QutGDINC/0L7RgdC40LzQstC+0LvRjNC90L4KICB7CiAgICBjaCA9IGxpbmVbcG9zXTsKICAgIHByaW50ZigiJWMiLGNoKTsKICAgIGlmICgoY2g9PSdcIicpJiYoZmxhZz09MSkpIGZsYWcgPSAwOyAgICAgICAgICAgIC8v0LTQvtC20LXQvSDQstGL0LnRgtC4INC80LDRgdGB0LjQsiB0b2tlbnNbMF09YWJjZDsgdG9rZW5zWzFdPWZkZGVoOyB0b2tlbnNbMl09ZWdmCiAgICBpZiAoKGNoPT0nXCInKSYmKGZsYWc9PTApKSBmbGFnID0gMTsKICAgIGlmICgoY2ghPScgJyl8fCgoY2g9PScgJykmJihmbGFnID0gMSkpKQogICAgewogICAgICB0b2tlbnNbcG9zaXRpb25dW3Bvc10gPSBjaDsKICAgICAgcG9zKys7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICBwcmludGYoIlxuIik7CiAgICBwcmludGYoIiVzIix0b2tlbnNbcG9zaXRpb25dKTsKICAgIHBvc2l0aW9uKys7CiAgICB9CiAgaWYgKHBvc2l0aW9uID49IGJ1ZnNpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/RgNCw0YHRiNC40YDRj9C10Lwg0LXRgdC70Lgg0L3QtSDRhdCy0LDRgtC40LvQviDRgdGC0YDQvtC6INC40LvQuCDQv9Cw0YHRj9GC0Lgg0LTQu9GPINGB0YLRgNC+0Log0YLQviDQstGL0LTQtdC70Y/QtdC8CiAgIGJ1ZnNpemUgKz0gTFNIX1RPS19CVUZTSVpFOwogICB0b2tlbnMgPSByZWFsbG9jKHRva2VucywgYnVmc2l6ZSAqIHNpemVvZihjaGFyKikpOwogICBpZiAoIXRva2VucykgewogICAgIGZwcmludGYoc3RkZXJyLCAibHNoOiDQntGI0LjQsdC60LAg0L/QsNC80Y/RgtC4XG4iKTsKICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CiAgIH0KICB9CiBpZiAocG9zID49IGJ1ZnNpemUwKQogewogIGJ1ZnNpemUwICs9IExTSF9UT0tfQlVGU0laRTsKICB0b2tlbnNbcG9zaXRpb25dID0gcmVhbGxvYyh0b2tlbnNbcG9zaXRpb25dLCBidWZzaXplMCAqIHNpemVvZihjaGFyKikpOwogIGlmICghdG9rZW5zKQogIHsKICAgIGZwcmludGYoc3RkZXJyLCAibHNoOiDQntGI0LjQsdC60LAg0L/QsNC80Y/RgtC4XG4iKTsKICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKICB9CiB9CiB9CiB0b2tlbnNbcG9zaXRpb25dID0gTlVMTDsKIHJldHVybiB0b2tlbnM7Cn0KCgp2b2lkIGxzaF9sb29wKHZvaWQpCnsKICBjaGFyICpsaW5lOwogIGNoYXIgKiphcmdzOwogIGludCBzdGF0dXM7CgogIGRvCiAgewogICAgcHJpbnRmKCI+ICIpOyAgICAgICAgICAgICAgICAgLy/Qv9GA0LjQs9C70LDRiNCw0LXQvAogICAgbGluZSA9IGxzaF9yZWFkX2xpbmUoKTsgICAgICAgLy/RhNGD0L3QutGG0LjRjyDRh9GC0LXQvdC40Y8g0LLRhdC+0LTQvdC+0Lkg0YHRgtGA0L7QutC4CiAgICBhcmdzID0gbHNoX3NwbGl0X2xpbmUobGluZSk7ICAvL9GA0LDQt9Cx0LjQtdC90LjQtQogICAgc3RhdHVzID0gbHNoX2V4ZWN1dGUoYXJncyk7ICAgLy/QstGL0L/QvtC70L3QtdC90LjQtQoKICAgIGZyZWUobGluZSk7ICAgICAgICAgICAgICAgICAgIC8v0L7Rh9C40YHRgtC60LAKICAgIGZyZWUoYXJncyk7CiAgfSB3aGlsZSAoc3RhdHVzKTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgLy/Qt9Cw0LPRgNGD0LfQutCwINGE0LDQudC70L7QsiDQtdGB0LvQuCDQvtC90Lgg0LXRgdGC0Ywg0Lgg0LfQsNC/0YPRgdC6INC60L7QvNCw0L3QtAogIGxzaF9sb29wKCk7CiAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKfQo=
compilation info
prog.c: In function ‘lsh_launch’:
prog.c:9:3: error: unknown type name ‘pid_t’
pid_t pid, wpid;
^~~~~
prog.c:9:14: warning: variable ‘wpid’ set but not used [-Wunused-but-set-variable]
pid_t pid, wpid;
^~~~
stdout