#include #include #include #include #include #include #include #include #include using namespace std; static void cliente(int semid); static void servidor(int semid); int main(int argc, char *argv[]) { int semid = semget(IPC_PRIVATE, 1, IPC_CREAT | IPC_EXCL | 0660 ); if (semid == -1) { cerr << "Error creando el semaforo: " << strerror(errno) << endl; return EXIT_FAILURE; } cout << "Semid: " << semid << endl; int val = 0; if (semctl(semid, 0, SETVAL, val) == -1) { cerr << "Error establecer valor: " << semid << " debido a " << strerror(errno) << endl; return EXIT_FAILURE; } pid_t hijoSrv, hijoCln; if ((hijoSrv = fork()) == 0) { servidor(semid); } else if ((hijoCln = fork()) == 0) { cliente(semid); } int status; wait(&status); wait(&status); return EXIT_SUCCESS; } static void usage(const char *progname) { cerr << "Uso: " << progname << " " << endl; exit(EXIT_FAILURE); } static void cliente(int semid) { for (;;) { sleep(10); struct sembuf op[1]; op[0].sem_num = 0; op[0].sem_op = 1; op[0].sem_flg = 0; semop(semid, op, 1); } } static void servidor(int semid) { for (;;) { struct sembuf op[1]; op[0].sem_num = 0; op[0].sem_op = -1; op[0].sem_flg = 0; cout << "Esperando para imprimir" << endl; semop(semid, op, 1); cout << "Impresion lista" << endl; } }