rendered paste body/* Prosty interpreter polece */#include <sys/types.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#include <string.h>#include <signal.h>/*#include <wait.h>*/#include <sys/wait.h>#include <sys/resource.h>#define INPUTSIZ 256#define MAXPAR 5void signal_handler(int sig) { pid_t pid; int status; signal(SIGCHLD,signal_handler); while( (pid=wait3(&status,0,0))>0 ){ if(WIFEXITED(status)){ printf("Proces nr %d zakonczony z kodem wyjscia %d\n", pid,WEXITSTATUS(status)); } if(WIFSIGNALED(status)){ printf("Proces nr %d dostal sygnal nr %d\n", pid,WTERMSIG(status)); } if(WIFSTOPPED(status)){ printf("Proces nr %d zatrzymany przez sygnal nr %d\n", pid, WSTOPSIG(status)); } }};void *worker(void *arg) { sigset_t sig; sigemptyset(&sig); sigaddset(&sig, SIGCHLD); pthread_sigmask(SIG_UNBLOCK,&sig,0); signal(SIGCHLD,signal_handler); while (1) pause(); return 0;};typedef struct { char znak; unsigned int jak_dlugo;} dane_watkowe;void *workerout(dane_watkowe *dw) { unsigned int counter; for (counter = 0; counter < (dw->jak_dlugo); counter++) { fprintf(stderr,"%c",dw->znak); sleep (1); } free (dw); return 0;};void doshell(char *cmd) { char *argv[MAXPAR+1], *p; int argc=0; pid_t pid; /* Dzielenie linii polecen na "wyrazy" */ if((argv[argc]=strtok(cmd," \t\n"))==NULL) return; while(argv[argc] && argc<MAXPAR-1){ argv[++argc]=strtok(NULL," \t\n"); } if (strcmp(argv[0],"koniec")==0) exit(0); else if (strcmp(argv[0],"output")==0) if ((argc != 2) && (argc!=3)) { fprintf(stderr,"Bledne uzycie wbudowanej funkcji output:\nUzycie: output jak_dlugo [znak]\n"); return; } else { dane_watkowe *dw; dw = malloc(sizeof(dane_watkowe)); if (argc == 3) dw->znak = *argv[2]; else dw->znak = '#'; dw->jak_dlugo = atoi(argv[1]); pthread_create(0,0,workerout,dw); return ; } if ( (pid = fork()) < 0) { perror("Blad wywolania fork"); exit(2); } if (pid == 0) { execvp(argv[0],argv); perror("Blad wywolania execvp"); exit(1); } }int main() { char buf[INPUTSIZ]; pthread_t tid; sigset_t sig; pthread_create(&tid,0,worker,0); sigemptyset(&sig); sigaddset(&sig, SIGCHLD); pthread_sigmask(SIG_BLOCK,&sig,0); printf("\n> "); while (fgets(buf, INPUTSIZ, stdin) != NULL) { doshell(buf); printf("\n> "); } exit(0);}