/* Prosty interpreter polece */ #include #include #include #include #include #include #include /*#include */ #include #include #define INPUTSIZ 256 #define MAXPAR 5 void 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] && argcznak = *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); }