diff options
Diffstat (limited to 'sync/sync.c')
-rw-r--r-- | sync/sync.c | 60 |
1 files changed, 47 insertions, 13 deletions
diff --git a/sync/sync.c b/sync/sync.c index e1fbc4c..66574a1 100644 --- a/sync/sync.c +++ b/sync/sync.c @@ -1,16 +1,23 @@ -#include <sys/types.h> +#include <stdio.h> +#include <stdlib.h> #include <sys/ipc.h> #include <sys/shm.h> -#include <stdlib.h> +#include <sys/types.h> +#include <sys/wait.h> #include <unistd.h> -#include <stdio.h> + +void quit(signum) +int signum; +{ + shmctl(shmid, IPC_RMID, NULL); +} int main(argc, argv) int argc; char **argv; { - int shmid, i, pid, n_read, n_write; + int shmid, i, pid, n_read, n_write, w; char *mem, **arg_r, **arg_w; if (argc < 2) { @@ -29,33 +36,60 @@ char **argv; perror("shmat"); exit(1); } + signal(SIGQUIT, quit); +printf("\nSHMID: %d\nsetting initial memory values...\n", shmid); for (i = 0; i < 1<<14; i++) { *(mem + i) = 0x30; } - arg_r = malloc(sizeof(char*) * 2); - arg_w = malloc(sizeof(char*) * 2); + arg_r = malloc(sizeof(char*) * 3); + arg_w = malloc(sizeof(char*) * 3); + *arg_r = malloc(sizeof(char) * 10); + *arg_w = malloc(sizeof(char) * 10); + + *(arg_r + 1) = malloc(sizeof(char) * 50); + *(arg_w + 1) = malloc(sizeof(char) * 50); - *(arg_r + 1) = NULL; - *(arg_w + 1) = NULL; + *arg_r = "reader"; + *arg_w = "writer"; + *(arg_r + 2) = NULL; + *(arg_w + 2) = NULL; + +printf("forking readers...\n"); for (i = 0; i < n_read; i++){ - sprintf(*arg_r, "%d", i); +printf("sprintf...\n"); + sprintf(*(arg_r + 1), "%d", i); +printf("\t%d\n",i); if (pid = fork()) { - printf("starting reader %d...\n", i); + /* printf("starting reader %d...\n", i); */ } else { - execvp("./reader", arg_r); + int ret = execv("./reader", arg_r); + printf("exec retern %d", ret); } } +printf("forking writers...\n"); for (i = 0; i < n_write; i++) { - sprintf(*arg_w, "%d", i); + sprintf(*(arg_w + 1), "%d", i); +printf("\t%d\n", i); if (pid = fork()) { - printf("starting writer %d...\n", i); + /* printf("starting writer %d...\n", i); */ } else { execvp("./writer", arg_w); } } + + shmdt(mem); +printf("sync done...\n"); +/* TODO + * why is this returning 8 + */ + for (i = 0; i < (n_write + n_read); i++) { + wait(&w); + printf("\nReturned with code:%d\n", WTERMSIG(w)); + } + quit(); } |