OS Online #1
unknown
c_cpp
2 years ago
4.8 kB
4
Indexable
#include "election.h" int *shm; int sharedMemSize; FILE *GL_secret_file; /* INFO: I have assumed that we are required to print in a file hence I have printed the secret received by GL in a GL_secret.txt file. */ void signal_handler1(int signum, siginfo_t *siginfo, void *ucontext) { int valReceived = siginfo->si_int; printf("Received SIGUSR1 from EC\n"); //if not enough supporters if(valReceived == -1) exit(0); } void signal_handler2(int signum, siginfo_t *siginfo, void *ucontext) { int valReceived = siginfo->si_int; printf("Received SIGUSR2 and value %d from EC\n", valReceived); printf("Printing received values\n"); for(int i = 0; i < valReceived; i++) { fprintf(GL_secret_file, "%c", (char)shm[i]); } if(valReceived < sharedMemSize) { //in case we are done with the transfer exit(0); } else { //send SIGUSR1 to EC such that it sends the next characters pid_t pid = EC_pid; union sigval sv; sv.sival_int = 1; sigqueue(pid, SIGUSR1, sv); } } int GL() { if(!fork()) { execlp("ls", "ls", "-lh", "MyTeam/", NULL); } GL_pid = getpid(); int fd_file = open("testFile.txt", O_RDWR); int std_out = dup(1); int fd1 = dup2(fd_file, 1); pid_t children[4]; for(int i = 0; i < 4; i++) { pid_t ret = fork(); if(ret > 0) { children[i] = ret; waitpid(ret, NULL, WUNTRACED); } else { kill(getpid(), SIGSTOP); int supporterNum = 0; if(!fork()) { if(i == 0) { execlp("wc", "wc", "-l", "MyTeam/2020.txt", NULL); } else if(i == 1) { execlp("wc", "wc", "-l", "MyTeam/2021.txt", NULL); } else if(i == 2) { execlp("wc", "wc", "-l", "MyTeam/2022.txt", NULL); } else { execlp("wc", "wc", "-l", "MyTeam/2023.txt", NULL); } } exit(supporterNum); } } //restore stdout dup2(std_out, 1); // int totalSupport = 0; printf("Here\n"); int number = 0; FILE* testFile = fopen("testFile.txt", "r+"); fseek(testFile, 0, SEEK_SET); char num; fscanf(testFile, "%c", &num); printf("\n\n%c\n\n", num); number += num; fseek(testFile, 18, SEEK_SET); fscanf(testFile, "%c", &num); printf("\n\n%c %d\n\n", num, num); number += num; fseek(testFile, 36, SEEK_SET); fscanf(testFile, "%c", &num); printf("\n\n%c\n\n", num); number += num; fseek(testFile, 54, SEEK_SET); fscanf(testFile, "%c", &num); printf("\n\n%c\n\n", num); number += num; printf("Here2\n"); int totalSupport = number / 9; for(int i = 0; i < 4; i++) { kill(children[i], SIGCONT); int tmp = 0; waitpid(children[i], &tmp, 0); totalSupport += tmp; } //Create shared memory sharedMemSize = totalSupport; int shmid; key_t key = 6969; int flag = SHM_R | SHM_W; //flags set to Shared memory read and write to allow said operations shmid = shmget(key, totalSupport, flag); if(shmid < 0) { shmid = shmget(key, totalSupport, flag | IPC_CREAT); //adding the IPC_CREAT flag to indicate that the shared memory needs to be created. if (shmid < 0) { perror("shmget | IPC_CREAT"); exit(1); } } shm = (int *) shmat(shmid, NULL, 0); //letting the operating system pick the address, stroing the returned pointer in shm. if(shm == (int *) -1) { perror("shmat"); exit(1); } shm[0] = getpid(); shm[1] = totalSupport; //stdout is the GL_secret file such that printf writes to GL_secret.txt GL_secret_file = fopen("GL_secret.txt", "r+"); //action for SIGUS1 struct sigaction act1; act1.sa_sigaction = signal_handler1; sigemptyset(&act1.sa_mask); act1.sa_flags = SA_SIGINFO | SA_RESTART; sigaction(SIGUSR1, &act1, NULL); //action for SIGUSR2 struct sigaction act2; act2.sa_sigaction = signal_handler2; sigemptyset(&act2.sa_mask); act2.sa_flags = SA_SIGINFO | SA_RESTART; sigaction(SIGUSR2, &act2, NULL); //send the signal to EC with number of supporters printf("Sent the signal with %d supporters\n", shm[1]); pid_t pid = EC_pid; union sigval sv; sv.sival_int = key; sigqueue(pid, SIGUSR1, sv); while(1); exit(0); }
Editor is loading...
Leave a Comment