diff options
author | Tucker Evans <tuckerevans24@gmail.com> | 2019-02-18 07:35:54 -0500 |
---|---|---|
committer | Tucker Evans <tuckerevans24@gmail.com> | 2019-02-18 07:35:54 -0500 |
commit | e8b1808eaf87a49e4c34ebbfb66854baa627418c (patch) | |
tree | 8a4bb15321992702b6b26e34bd2ed3a55bb7b0d9 /CS3871/sync/writer.c | |
parent | 6cc5652a8af3361288393718ec2adb2889c9af1e (diff) |
Moves assignments to given course folder.
Diffstat (limited to 'CS3871/sync/writer.c')
-rw-r--r-- | CS3871/sync/writer.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/CS3871/sync/writer.c b/CS3871/sync/writer.c new file mode 100644 index 0000000..d38dd70 --- /dev/null +++ b/CS3871/sync/writer.c @@ -0,0 +1,76 @@ +#include <errno.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/ipc.h> +#include <sys/select.h> +#include <sys/sem.h> +#include <sys/shm.h> +#include <sys/types.h> +#include <sys/types.h> +#include <time.h> +#include <unistd.h> + +#define NSEM 3 + +char *mem; + +void quit(signum) +int signum; +{ + shmdt(mem); + exit(1); +} + +int main(argc, argv) +int argc; +char **argv; +{ + int shmid, semid, i, pid, id; + char *mem; + struct sembuf sb; + + if (argc < 2) { + printf("usage: writer [id]\n"); + exit(1); + } + + id = atoi(argv[1]); + + + if ((shmid = shmget(52, 1<<14, IPC_CREAT | 0666)) == -1){ + perror("shmget: shmget failed"); + exit(1); + } + + if ((mem = shmat(shmid, NULL, 0)) == (char *) -1) { + perror("shmat"); + exit(1); + } +printf("Wshmid: %x\n", shmid); + + if ((semid = semget(shmid, NSEM, 0)) == -1) { + perror("Wsemget: "); + exit(1); + } + + signal(SIGQUIT, quit); + + srand(time(NULL)); + + while (1) { + rand() % id; + + sb.sem_num = 0; sb.sem_op = -1; sb.sem_flg = 0; + semop(semid, &sb, 1); + + for (i = 0; i < 1<<14; i++) { + mem[i]= 0x30 + id; + } + + sb.sem_op = 1; + semop(semid, &sb, 1); + + sleep(rand() % ((id * 2) + 1)); + } +} |