main() { char *mem_ptr, *ctime(); long now; int n; seg_id = shmget(TIME_MEM_KEY, SEG_SIZE, IPC_CREAT|0777); if( seg_id == -1 ) oops("shmget", 1); mem_ptr = shmat(seg_id, NULL, 0); if (mem_ptr == (void *) -1) oops("shmat", 2); semset_id = semget(TIME_SEM_KEY, 2, (0666|IPC_CREAT|IPC_EXCL)); if (semset_id == -1) oops("segget", 3); set_sem_value(semset_id, 0, 0); set_sem_value(semset_id, 1, 0); signal(SIGINT, cleanup); for (n = 0; n < 60; n++) { time(&now); printf("\t shm_ts2 waiting for lock\n"); wait_and_lock(semset_id); printf("\t shm_ts2 updateing memory\n"); strcpy(mem_ptr, ctime(&now)); sleep(5); release_lock(semset_id); printf("\t shm_ts released lock\n"); sleep(1); } cleanup(0); }
int main(int argc, char **argv) { int num_items = 15; if((argc == 3 && (strcmp("-items", argv[1]) == 0))){ int aux = atoi(argv[2]); if(aux < MAX_ITEMS && aux > 0) num_items = aux; else{ sprintf(mensaje, "Error: el número de items debe estar comprendido entre 0 y %d\n", MAX_ITEMS); write (STDOUT_FILENO, mensaje, strlen(mensaje)); exit(0); } } else if (argc != 1) { sprintf(mensaje, "Usage: inicializa [-items] [num_items]\n"); write (STDOUT_FILENO, mensaje, strlen(mensaje)); exit(0); } tpBuffer pBuffer = get_buf(); // Se crea el área de memoria compartida sprintf(mensaje, "[padre (pid = %d)] Buffer creado!\n", getpid()); write (STDOUT_FILENO, mensaje, strlen(mensaje)); initialize(pBuffer, num_items); // Se inicializa int semId = get_sem(); // Se crean los semáforos set_sem_value (semId, SEM_VACIO, num_items); set_sem_value (semId, SEM_MUTEX, 1); set_sem_value (semId, SEM_LLENO, 0); sprintf(mensaje, "[padre (pid = %d)] Semáforo creado!\n", getpid()); write (STDOUT_FILENO, mensaje, strlen(mensaje)); return 0; }