Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- char firstInput[MAX_LINE];
- char endMsg = EOT;
- int pipes[4][2], i, pid;
- ssize_t byteSent;
- for(i=0; i<4; i++)
- {
- if(pipe(pipes[i]) < 0)
- {
- printf("couldnt make pipe..");
- }
- }
- scanf("%s", firstInput);
- pid=fork(); //Writer process starts
- if(pid==(pid_t)0)
- {
- //inside Writer process:
- close(pipes[READER32_P][INPUT]);
- close(pipes[READER32_P][OUTPUT]);
- close(pipes[READER64_p][INPUT]);
- close(pipes[READER64_p][OUTPUT]);
- close(pipes[READERS_P][INPUT]);
- close(pipes[READERS_P][OUTPUT]);
- close(pipes[WRITER_P][OUTPUT]);
- Writer(pipes, firstInput);
- exit(EXIT_SUCCESS);
- }
- else
- {
- pid=fork();
- if(pid==(pid_t)0) //Reader32 process starts
- {
- //inside Reader32 process:
- close(pipes[WRITER_P][INPUT]);
- close(pipes[WRITER_P][OUTPUT]);
- close(pipes[READER64_p][INPUT]);
- close(pipes[READER64_p][OUTPUT]);
- close(pipes[READERS_P][INPUT]);
- close(pipes[READER32_P][OUTPUT]);
- Reader32(pipes);
- exit(EXIT_SUCCESS);
- }
- else
- {
- pid=fork(); //Reader64 process starts
- if(pid == (pid_t)0)
- {
- //inside Reader64:
- close(pipes[WRITER_P][INPUT]);
- close(pipes[WRITER_P][OUTPUT]);
- close(pipes[READER32_P][INPUT]);
- close(pipes[READER32_P][OUTPUT]);
- close(pipes[READERS_P][INPUT]);
- close(pipes[READER64_p][OUTPUT]);
- Reader64(pipes);
- exit(EXIT_SUCCESS);
- }
- else
- {
- //main process:
- close(pipes[WRITER_P][INPUT]);
- close(pipes[READER32_P][INPUT]);
- close(pipes[READER64_p][INPUT]);
- close(pipes[READERS_P][OUTPUT]);
- char msg = OK;
- int lastInput = 0;
- int polyType;
- unsigned long long polygon;
- while(!lastInput)
- {
- polygon = 0;
- scanf("%d", &polyType);
- if(polyType==32)
- {
- write(pipes[READER32_P][OUTPUT], &msg, sizeof(char));
- }
- else if(polyType==64)
- {
- byteSent = write(pipes[READER64_p][OUTPUT], &msg, sizeof(char));
- printf("sent %zd bytes from main_process to reader64n msg sent is %cn", byteSent, msg);
- }
- wait(NULL);
- read(pipes[READERS_P][INPUT], &polygon, sizeof(unsigned long long int));
- if((polygon & 1) > 0)
- lastInput=1;
- write(pipes[WRITER_P][OUTPUT], &polygon, sizeof(unsigned long long int));
- }
- //sending ending msgs to all child processes:
- write(pipes[WRITER_P][OUTPUT], &endMsg, sizeof(char));
- write(pipes[READER32_P][OUTPUT], &endMsg, sizeof(char));
- write(pipes[READER64_p][OUTPUT], &endMsg, sizeof(char));
- //closing left pipes:
- close(pipes[WRITER_P][OUTPUT]);
- close(pipes[READER32_P][OUTPUT]);
- close(pipes[READER64_p][OUTPUT]);
- close(pipes[READERS_P][INPUT]);
- //finishing the process:
- printf("main_process pid=%d is going to exit",getpid());
- return 0;
- }
- }
- }
- printf("Reader32 started...n");
- unsigned int endMsgRcvd=0;
- ssize_t byteSent;
- char reader32Buffer[MAX_LINE];
- unsigned long long int polygon32;
- unsigned long long int temp32;
- while(!endMsgRcvd)
- {
- byteSent = read(pipes[READER32_P][INPUT],reader32Buffer,MAX_LINE);
- if(reader32Buffer[0] == EOT)
- {
- endMsgRcvd = 1;
- break;
- }
- else
- {
- polygon32 = 0;
- temp32 = 0;
- scanf("%llx", &polygon32);
- scanf("%llx", &temp32);
- temp32 <<= 32;
- polygon32 |= temp32;
- write(pipes[READERS_P][OUTPUT], &polygon32, sizeof(unsigned long long));
- }
- }
- close(pipes[READER32_P][INPUT]);
- close(pipes[READERS_P][OUTPUT]);
- fprintf(stderr, "reader32 pid=%d is going to exit...", getpid());
- printf("Reader32 started...n");
- unsigned int endMsgRcvd=0;
- ssize_t byteSent;
- char reader32Buffer[MAX_LINE];
- unsigned long long int polygon32;
- unsigned long long int temp32;
- while(!endMsgRcvd)
- {
- byteSent = read(pipes[READER32_P][INPUT],reader32Buffer,MAX_LINE);
- if(reader32Buffer[0] == EOT)
- {
- endMsgRcvd = 1;
- break;
- }
- else
- {
- polygon32 = 0;
- temp32 = 0;
- scanf("%llx", &polygon32);
- scanf("%llx", &temp32);
- temp32 <<= 32;
- polygon32 |= temp32;
- write(pipes[READERS_P][OUTPUT], &polygon32, sizeof(unsigned long long));
- }
- }
- close(pipes[READER32_P][INPUT]);
- close(pipes[READERS_P][OUTPUT]);
- fprintf(stderr, "reader32 pid=%d is going to exit...", getpid());
Add Comment
Please, Sign In to add comment