All pastes #564400 Raw Edit

SOE lab2

public c v1 · immutable
·published 2007-06-13 16:08 UTC
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);}