Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdlib.h"
- #include "stdio.h"
- #include "string.h"
- #include <unistd.h>
- #include <signal.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <ctype.h>
- #define blocksize 4096
- int mypipe[2];
- char file1[100],file2[100];
- void sigusr1handler(int sig){
- if(sig == SIGUSR1){
- printf("I GOT SIGUSR1!\n");
- dup2(mypipe[1],1);
- execlp("cat","cat",file1,NULL);
- printf("Failed execlp on first child!\n");
- exit(-7);
- }
- }
- void fiu1(){
- struct sigaction s;
- s.sa_flags = 0;
- s.sa_handler = sigusr1handler;
- close(mypipe[0]);
- if(sigaction(SIGUSR1,&s,NULL)<0){//pregatim fiu1 sa primeasca SIGUSR1
- printf("Error at sigaction SIGUSR1!\n");
- exit(-6);
- }
- while(1){
- printf("Child 1: I have pid=%d\n",getpid());//afisam in fiu1 pid-ul lui pana primeste SIGUSR1
- }
- }
- void sigusr2handler(int sig){
- if(sig == SIGUSR2){
- printf("I GOT SIGUSR2!\n");
- dup2(mypipe[1],1);
- execlp("cat","cat",file2,NULL);
- printf("Failed execlp on first child!\n");
- exit(-7);
- }
- }
- void fiu2(){
- struct sigaction s;
- s.sa_flags = 0;
- s.sa_handler = sigusr2handler;
- close(mypipe[0]);
- if(sigaction(SIGUSR2,&s,NULL)<0){//pregatim fiu2 sa primeasca SIGUSR2
- printf("Error at sigaction SIGUSR2!\n");
- exit(-6);
- }
- while(1){
- printf("Child 2: I have pid=%d \n",getpid());//afisam pid-ul fiului2 pana primeste SIGUSR2
- }
- }
- void siginthandler(int sig){
- if(sig == SIGINT){//cand primeste fiul3 SIGINT
- printf("I GOT SIGINT!\n");
- char buffer[blocksize];
- char aux[blocksize];
- int r;
- int k;
- while((r=read(mypipe[0],buffer,blocksize))>0){//citim din pipe cat mai este
- strcpy(aux,"");//golim ce e in aux
- k=0;
- for(int i=0;i<r;i++){//parcurgem litera cu litera
- if(buffer[i] == ' ' || buffer[i]=='\n'){//daca am gasit spatiu sau newline inseamna ca s-o terminat un cuvant, si il afisam
- aux[k] = '\0';
- printf("%s\n",aux);
- strcpy(aux,"");
- k=0;
- }
- else{//daca ii altceva inafara de spatiu sau litera, adaugam caracteru ca sa construim cuvantul
- aux[k]=buffer[i];
- k++;
- }
- }//poate asta se putea face mai destept da nu stiu cum..oricum n-are relevanta pentru pipeuri lucratu cu stringuri
- }
- close(mypipe[0]);
- exit(0);
- }
- }
- void fiu3(){
- struct sigaction s;
- s.sa_flags = 0;
- s.sa_handler = siginthandler;
- close(mypipe[1]);
- if(sigaction(SIGINT,&s,NULL)<0){//pregatim fiu3 sa primeasca SIGINT
- printf("Error at sigaction SIGINT!\n");
- exit(-6);
- }
- while(1){
- printf("Child 3: I have pid=%d\n",getpid());//afisam pid-ul fiului 3 pana primeste SIGINT
- }
- }
- void sigalarmhandler(int sig){
- printf("BOO!\n");
- exit(0);
- }
- int pid1,pid2,pid3;
- void parinte(){
- close(mypipe[0]);
- close(mypipe[1]);
- printf("Sending SIGUSR1 to %d, SIGUSR2 to %d, SIGINT to %d.\n",pid1,pid2,pid3);
- kill(pid1,SIGUSR1);
- kill(pid2,SIGUSR2);
- kill(pid3,SIGINT);
- //trimitem semnalele la copii
- struct sigaction s;
- s.sa_flags = 0;
- s.sa_handler=sigalarmhandler;
- if(sigaction(SIGALRM,&s,NULL)<0){//pregatim parintele sa primeasca SIGALRM
- printf("Error on sigaction SIGALRM!\n");
- exit(-10);
- }
- alarm(7);//trimitem peste 7 secunde semnalul SIGALRM
- while(1);
- }
- int main(int argc, char *argv[]){
- if(argc != 3){
- printf("Usage:./%s file1 file2\n",argv[0]);
- exit(-1);
- }
- strcpy(file1,argv[1]);
- strcpy(file2,argv[2]);
- if(pipe(mypipe)<0){
- printf("Error at creating pipe!\n");
- exit(-2);
- }
- if((pid1=fork())<0){
- printf("Error at first fork!\n");
- exit(-3);
- }
- if(pid1==0){
- fiu1();
- }
- if((pid2=fork())<0){
- printf("Error at second fork!\n");
- exit(-4);
- }
- if(pid2==0){
- fiu2();
- }
- if((pid3=fork())<0){
- printf("Error at third fork!\n");
- exit(-5);
- }
- if(pid3==0){
- fiu3();
- }
- sleep(0.5);//fara sleepu asta nu se intampla nimic
- parinte();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement