Нужно Модернизировать Программу.(язык С)

  • Автор темы Ekaterina1
  • Дата начала
E

Ekaterina1

#1
Посмотреть существующий код(по возможности сделать его более человеческим),и модифицировать подпрограмму чтения таким образом, чтобы символы '|', '<'и '>' воспринимались с наряду уже имеющимся с предыдущей работы символом '&' как разделительные. Реализовать перенаправления стандартных потоков ввода и вывода. Используя системные вызовы open, close, read, write, dup, dup2.

есть программа, которая работает в качестве командного интерпритатора, на доработать её так что бы стандартным потоком ввода и вывод из файла, например при команта ls > fail записывала туда состоянии директории, а при команде < fail использовала поток ввода для этой команы из файла.
<!--shcode--><pre><code class='c'>#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <fcntl.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <sys/wait.h>



//struktura dlya simvola

struct simvol

{

char a;

struct simvol *next;

};



//struktura dlya slova

struct slovo

{

char *a;

struct slovo *next;

};





struct simvol *sim, *first=NULL;

struct slovo *slo, *g, *slo2=NULL;

char *str=NULL;



//funk. dlya perenosa simvola v strukturu///////

void sb(int p)

{

sim=(struct simvol*)malloc(sizeof(struct simvol));

(*sim).a=p;

(*sim).next=first;

first=sim;

}

/////////////////////////////////////////////////



//videlenie pamyati pod massiv simvolov/////////

void al(int n)

{

str=(char *)malloc(sizeof(char)*(n+1));

str[n]='\0';

n--;



while(first!=NULL)

{

str[n]=(*first).a;

sim=(*first).next;

free(first);

first=sim;

n--;

}

}

//////////////////////////////////////////////////



















//funk. dlya perenosa slova v strukturu slov//////

void hm(int n)

{

slo=(struct slovo*)malloc(sizeof(struct slovo));

slo->a=str;

slo->next=slo2;

slo2=slo;

}

//////////////////////////////////////////////////



//funktsiya ochishaet pamyat' ot massiva slov i spiska slov

void udal(char **v, int m)

{

free(v);

slo2=g;

while(slo2!=NULL)

{

slo=slo2->next;

//printf("%s\n", slo2->a);

free(slo2->a);

free(slo2);

slo2=slo;

}

}

//////////////////////////////////////////////////





/////////////////////main/////////////////////////

int main()

{

int p, c; //simvol

int n, m; //schyotchoki

int l=0; //flag

char **v=NULL;



n=0;

int k=0;

printf("->");



while((p=getchar())!=EOF)

{

if((p!=' ')&&(p!='\n')&&(p!='&'))

{

l=0;

sb(p); //sozdayot strukturu s bukvoy

n++;

}



if(((p==' ')||(p=='\n')||(p=='&'))&&(l==0))

{

l=1;

al(n); //videlenie pamyati pod massiv simvolov

n=0;

hm(n); //funk. dlya perenosa slova v strukturu slov

k++;

}



if(p=='\n')

{

m=k;

v=(char**)malloc(sizeof(char*)*(k+1));

v[k]='\0';

k--;

g=slo2;

while(slo2!=NULL)

{

slo=slo2->next;

v[k]=slo2->a;

slo2=slo;

k--;

}

printf("->");

if(strcmp("cd", v[0])==0)

chdir(v[1]);



else

{

pid_t pid = fork();

if (!pid)

{

execvp(v[0], v);

printf("ups");

exit(-1);

}

}



if(c=='&')

{

pid_t cpid = wait3(NULL, WNOHANG, NULL);//getpid();

cpid=getpid();

printf("ID process = %d\n->", cpid);

wait3(NULL, WNOHANG, NULL);

}

else

{

wait(NULL);

}

udal(v, m); //funktsiya ochishaet pamyat' ot massiva slov i spiska slov

}

if(p=='\n')

k=0;

c=p;

if((c=='&')&&(p!='\n'))

printf("Karaul!\n");

}

g=NULL;

return 0;

}[/CODE]