Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <pthread.h>
- #include <signal.h>
- #include <sys/stat.h>
- #include <errno.h>
- struct sembuf buf;
- sigset_t maska;
- int pom=1;
- struct mymsgbuf {
- long mtype; /* Typ wiadomości */
- char i[20]; /* Zmienna przekazywana w wiadomości, w tym przypadku liczba całkowita */
- } msg;
- void sigodbierzzakoncz(int sig)
- {
- kill(getppid(),SIGRTMAX);
- }
- void sigzakoncz()//konczenie programu
- {
- puts("proces macierzysty koncze program\n.\n.\n.\n");
- kill(getpid()+3,SIGKILL);
- kill(getpid()+2,SIGKILL);
- kill(getpid()+1,SIGKILL);
- kill(getpid(),SIGKILL);
- }
- void sigodbierzstop(int sig)
- {
- kill(getppid(),SIGRTMIN+3);
- }
- void sigprzeslijstop(int sig)
- {
- kill(getpid()+1,SIGRTMAX-3);
- kill(getpid()+2,SIGRTMAX-3);
- kill(getpid()+3,SIGRTMAX-3);
- }
- void sigstop(int sig)
- {
- printf("%d wstrzymany\n",getpid());
- sigfillset(&maska);
- sigdelset(&maska,SIGRTMIN+2);
- sigdelset(&maska,SIGRTMIN+1);
- sigdelset(&maska,SIGRTMAX-1);
- sigsuspend(&maska);
- }
- void sigodbierzstart()
- {
- kill(getppid(),SIGRTMAX-2);
- }
- void sigprzeslijstart()
- {
- kill(getpid()+3,SIGRTMAX-1);
- kill(getpid()+2,SIGRTMAX-1);
- kill(getpid()+1,SIGRTMAX-1);
- }
- void sigstart()
- {
- }
- struct mymsgbuf buff;
- int open_queue( key_t keyval ) {
- int qid;
- if((qid = msgget( keyval, IPC_CREAT | 0660 )) == -1)
- return(-1);
- return(qid);
- }
- int send_message( int qid, struct mymsgbuf *qbuf ){
- int result, length;
- length = sizeof(struct mymsgbuf) - sizeof(long);
- if((result = msgsnd( qid, qbuf, length, 0)) == -1)
- return(-1);
- return(result);
- }
- int remove_queue( int qid ){
- if( msgctl( qid, IPC_RMID, 0) == -1)
- return(-1);
- return(0);
- }
- int read_message( int qid, long type, struct mymsgbuf *qbuf ){
- int result, length;
- length = sizeof(struct mymsgbuf) - sizeof(long);
- if((result = msgrcv( qid, qbuf, length, type, 0)) == -1)
- return(-1);
- return(result);
- }
- void zwieksz(int semid,int semnum)
- {
- buf.sem_num=semnum;
- buf.sem_op=1;
- buf.sem_flg=0;
- if(semop(semid,&buf,1)==-1)
- //puts("err zwieksz");
- ;
- }
- void zmniejsz(int semid,int semnum)
- {
- buf.sem_num=semnum;
- buf.sem_op=-1;
- buf.sem_flg=0;
- if(semop(semid,&buf,1)==-1)
- //puts("err zmniejsz");
- ;
- }
- int typwiad=12345;
- //////////////////////////////////////main
- int main()
- {
- int fd[2]={0,0};
- pipe(fd);
- signal(SIGRTMIN+3,sigprzeslijstop);
- signal(SIGRTMAX-2,sigprzeslijstart);
- signal(SIGRTMAX,sigzakoncz);
- //////////////proces1
- if(fork()==0)
- {
- signal(SIGRTMIN,sigodbierzstop);
- signal(SIGRTMAX-3,sigstop);
- signal(SIGRTMIN+1,sigodbierzstart);
- signal(SIGRTMAX-1,sigstart);
- signal(SIGRTMIN+2,sigodbierzzakoncz);
- FILE *pfile;
- int semid;
- char x;
- semid=semget(5281,3,IPC_CREAT|0600);
- if(semid==-1)
- puts("err tworzenie tablicy semaforow!");
- semctl(semid,0,SETVAL,(int)1);
- semctl(semid,1,SETVAL,(int)0);
- semctl(semid,2,SETVAL,(int)0);
- if((pfile=fopen("dane.txt","r"))==NULL)
- puts("blad przy otwieraniu dane.txt");
- x=fgetc(pfile);
- close(fd[0]);
- while(1)
- {
- while(!feof(pfile))
- {signal(SIGRTMIN,sigodbierzstop);
- signal(SIGRTMAX-3,sigstop);
- signal(SIGRTMIN+1,sigodbierzstart);
- signal(SIGRTMAX-1,sigstart);
- signal(SIGRTMIN+2,sigodbierzzakoncz);
- zmniejsz(semid,0);
- //printf("proces1: %c a int %d a hex %x\n",x,(int)x,(int)x);
- write(fd[1],&x,sizeof(x));sleep(1);
- zwieksz(semid,1);
- x=fgetc(pfile);
- }
- sleep(1);puts("koniec pliku");
- }
- }
- ////////////proces2
- if(fork()==0)
- {
- signal(SIGRTMIN,sigodbierzstop);
- signal(SIGRTMAX-3,sigstop);
- signal(SIGRTMIN+1,sigodbierzstart);
- signal(SIGRTMAX-1,sigstart);
- signal(SIGRTMIN+2,sigodbierzzakoncz);
- int semid;
- char y;
- char hex[2];
- semid=semget(5281,3,0600);
- if(semid==-1)
- puts("err przylaczanie tablicy semaforow k1!");
- close(fd[1]);
- int qid;
- key_t msgkey;
- /* Generowanie wartości klucza IPC */
- msgkey = ftok(".", 'm');
- /* Otwieranie/Tworzenie kolejki komunikatow */
- if(( qid = open_queue( msgkey)) == -1) {
- puts("err tworzenie_kolejki");
- exit(1);
- }
- while(1)
- {signal(SIGRTMIN,sigodbierzstop);
- signal(SIGRTMAX-3,sigstop);
- signal(SIGRTMIN+1,sigodbierzstart);
- signal(SIGRTMAX-1,sigstart);
- signal(SIGRTMIN+2,sigodbierzzakoncz);
- zmniejsz(semid,1);
- read(fd[0],&y,sizeof(y));
- sprintf(&hex,"%x",y);
- printf("dane: %c hex: %s\n",y,hex);
- msg.mtype=typwiad;
- strcpy(msg.i,hex);
- send_message( qid, &msg );
- zwieksz(semid,2);
- }
- }
- ////////////proces3
- if(fork()==0)
- {
- signal(SIGRTMIN,sigodbierzstop);
- signal(SIGRTMAX-3,sigstop);
- signal(SIGRTMIN+1,sigodbierzstart);
- signal(SIGRTMAX-1,sigstart);
- signal(SIGRTMIN+2,sigodbierzzakoncz);
- char z[20];
- int semid;
- semid=semget(5281,3,0600);
- if(semid==-1)
- puts("err przylaczanie tablicy semaforow k2!");
- int qid;
- key_t msgkey;
- /* Generowanie wartości klucza IPC */
- msgkey = ftok(".", 'm');
- /* Otwieranie/Tworzenie kolejki komunikatow */
- if(( qid = open_queue( msgkey)) == -1) {
- perror("Otwieranie_kolejki");
- exit(1);
- }
- msg.mtype = typwiad;
- while(1)
- {signal(SIGRTMIN,sigodbierzstop);
- signal(SIGRTMAX-3,sigstop);
- signal(SIGRTMIN+1,sigodbierzstart);
- signal(SIGRTMAX-1,sigstart);
- signal(SIGRTMIN+2,sigodbierzzakoncz);
- zmniejsz(semid,2);
- read_message(qid, msg.mtype, &msg);
- strcpy(z,msg.i);
- if(pom%15==0 && pom!=0)
- fprintf(stderr,"%s \n",z);
- else
- fprintf(stderr,"%s ",z);
- pom=pom+1;printf("%d",pom);
- zwieksz(semid,0);
- }
- }
- while(1){ signal(SIGRTMIN+3,sigprzeslijstop);
- signal(SIGRTMAX-2,sigprzeslijstart);
- signal(SIGRTMAX,sigzakoncz);};
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement